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
。