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



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

我试过这个:

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());

这需要大约140ms的

还有这个:

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次。大多数时候,它都会达到谷歌表单中的超时限制。

我想知道是否有更快的方法来做这件事,因为我很想知道字符串在哪里,我只需要知道它在那里。字符串在一个特定的列中可用,这意味着我甚至不需要搜索整张表。

知道吗?

感谢

性能问题可能是因为您多次调用StrSearch()函数,而它每次都单独从电子表格中读取数据。只需读取一次数据,就可以大大加快速度。

试试这个:

/**
* 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);
}

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

的初始工作方式

  • 读取所有过滤器以收集在片材"中;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%,但它仍然是合理的。

感谢

最新更新