Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google apps script GoogleSheets脚本:搜索字符串的最快方式(不需要位置)_Google Apps Script_Google Sheets_Google Sheets Api - Fatal编程技术网

Google apps script GoogleSheets脚本:搜索字符串的最快方式(不需要位置)

Google apps script GoogleSheets脚本:搜索字符串的最快方式(不需要位置),google-apps-script,google-sheets,google-sheets-api,Google Apps Script,Google Sheets,Google Sheets Api,我正在试图找到在工作表中找到字符串的最快方法,我不需要知道字符串的位置,我只需要知道它是否已经存在 我试过这个: var raw = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("raw"); var raw_content = raw.getDataRange(); var textFinder = raw_content.createTextFinder(unique_id); var occu

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

我试过这个:

 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];
      }
  }
}
函数StrSearch(搜索字符串)
{
var sheet=SpreadsheetApp.getActiveSpreadsheet().getSheetByName(“原始”);
var values=sheet.getDataRange().getValues();

对于(var i=0,iLen=values.length;i性能问题可能是因为您多次调用
strearch()
函数,它每次都单独从电子表格中读取数据。只需读取一次数据,就可以大大加快读取速度

试试这个:

/**
* Gets text strings from a range and returns the ones that appear in a sheet.
*
* Usage in Apps Script:
*   const matches = findMatchesInSheet('SearchKeys!A2:A', 'RawDataSheet');
*
* Usage in a spreadsheet formula:
*   =findMatchesInSheet("SearchKeys!A2:A", "RawDataSheet")
*
* @param {String} searchKeyRangeA1 A1 notation of the range where search keys are.
* @param {String} sheetName The name of the sheet to search.
* @return {String[]} The search keys that were found in the sheet.
* @customfunction
*/
function findMatchesInSheet(searchKeyRangeA1, sheetName) {
  const ss = SpreadsheetApp.getActive();
  const searchFor = ss.getRange(searchKeyRangeA1).getDisplayValues()
    .flat().filter(String);
  const searchIn = ss.getSheetByName(sheetName).getDataRange().getDisplayValues()
    .flat().join('µ');
  return searchFor
    .filter(searchString => searchIn.indexOf(searchString) !== -1);
}

你所有的答案都帮助我深入研究这个问题,我最终找到了一个不同的解决方案

最初的工作方式

  • 读取“原始”表中要收集的所有过滤器
  • 将筛选器与日期组合以创建唯一的标签
  • 检查此唯一标签是否已在我的最终工作表中
  • 如果是,则不执行任何操作,如果否,则从GA获取数据并写入
我换成了下面的

  • 读取“原始”表中要收集的所有过滤器
  • 在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%,但仍然合理


谢谢

我无法从
中想象您的情况,我有大约30个标签要检查100个不同的日期,这意味着如果值已经存在,则检查3000次。
字符串在一个特定列中可用,这意味着我甚至不需要搜索整张表。
。我为我糟糕的英语表达歉意ll.你能以图像的形式提供示例情况吗?顺便问一下,你想如何执行脚本?它是自定义函数?@Tanaike谢谢。我基本上有一张表,有30行,每行包含一个正则表达式,对应于我想从GA API中获取的报告类型。我需要检索每个li的数据过去100天的nes。Ex:ga:eventAction==ORA_link。因此,我使用此筛选器和一个日期查询API。我将结果存储在另一个表中进行分析,但我需要确保不会存储两次相同的数据。如果我理解正确,您不需要知道字符串的位置,只需要知道它是否在表中?如果是这样,为什么您是否执行
.map(x=>x.getA1Notation())
?另外,无需使用
getDataRange
,因为类
Sheet
也有方法
createTextFinder
。谢谢你的回复。我不得不再次为我糟糕的英语技能道歉。不幸的是,我仍然无法从你的回复中想象你的情况。但我想试着理解它。当我可以的时候正确理解您的情况,我想考虑解决方案。我深表歉意,我无法很快解决您的问题。这将查找部分匹配和完全匹配。若要仅查找完全匹配,请使用
const searchIn='µ'+ss…join('µ')+'µ';
=>searchIn.indexOf('µ'+searchString+'µ')!=-1