首页 > 解决方案 > Google Sheets 脚本:搜索字符串的最快方法(不需要位置)

问题描述

我试图找到在工作表中找到字符串的最快方法,我不需要知道字符串的位置,我只需要知道它是否已经存在。

我试过这个:

 var raw = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("raw");
 var raw_content = raw.getDataRange();    
 var textFinder = raw_content.createTextFinder(unique_id);
 var occurrences = textFinder.findAll().map(x => x.getA1Notation());

这大约需要 140 毫秒

还有这个:

function StrSearch(searchString) 
{
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("raw");
var values = sheet.getDataRange().getValues();

for(var i=0, iLen=values.length; i<iLen; i++) 
  {
    if(values[i][0] == searchString) 
      {
        return values[i][1];
      }
  }
}

我有大约 30 个标签来检查 100 个不同的日期,这意味着如果值已经存在,则检查 3000 次。大多数情况下,它会达到 Google 表格中的超时限制。

我想知道是否有更快的方法来执行此操作,因为我很想知道字符串在哪里,我只需要知道它就在那里。该字符串在一个特定列中可用,这意味着我什至不需要搜索整个工作表。

任何想法?

谢谢

标签: google-apps-scriptgoogle-sheetsgoogle-sheets-api

解决方案


您的所有答案都帮助我进一步研究了这个问题,最终我得到了不同的解决方案。

最初的工作方式

  • 阅读所有过滤器以收集在工作表“RAW”中
  • 将过滤器与日期相结合以创建唯一标签
  • 检查这个独特的标签是否已经在我的最终工作表中
  • 如果是,则什么也不做,如果不是,则从 GA 获取数据并写入

我改成了以下

  • 阅读所有过滤器以收集在工作表“RAW”中
  • 每个过滤器进行一次查询 100 天,而不是一天一天
  • 将结果转储到我的最终工作表中
  • 最后删除重复项

整个过程现在大约需要 100 秒(包括对 API 的调用)。

我使用以下功能来删除重复项

function removeDuplicates() {
Logger.log('start duplicates '+Date.now());
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("raw");
var data = sheet.getDataRange().getValues();
var newData = [];
for (var i in data) {
  var row = data[i];
  var duplicate = false;
  for (var j in newData) {
    if (row.join() == newData[j].join()) {
      duplicate = true;
    }
  }
  if (!duplicate) {
    newData.push(row);
  }
}
sheet.clearContents();
sheet.getRange(1, 1, newData.length, newData[0].length).setValues(newData);
 Logger.log('end duplicates '+Date.now());

}

此功能最多占用总时间的 50%,但仍然合理。

谢谢


推荐阅读