Javascript 谷歌应用程序脚本在电子表格中查找文本并返回位置索引
我是谷歌应用程序脚本的新手,我的JavaScript也不是很强,但这两个似乎都不是问题,因为我的代码在第一次运行时就可以工作,但当我尝试再次调用它时,它失败了 简单地说,我正在尝试使用一个函数,该函数将在给定的范围内动态查找给定的文本。虽然看起来可能有一个内置的包可以做到这一点,但我不知道如何实现它。而且这些文档对新手没有帮助 备选方案1:将实施以下措施: 由于这并没有成功地找到如何做到这一点,我开始创建以下两个简单的函数,选项2:Javascript 谷歌应用程序脚本在电子表格中查找文本并返回位置索引,javascript,google-apps-script,find,Javascript,Google Apps Script,Find,我是谷歌应用程序脚本的新手,我的JavaScript也不是很强,但这两个似乎都不是问题,因为我的代码在第一次运行时就可以工作,但当我尝试再次调用它时,它失败了 简单地说,我正在尝试使用一个函数,该函数将在给定的范围内动态查找给定的文本。虽然看起来可能有一个内置的包可以做到这一点,但我不知道如何实现它。而且这些文档对新手没有帮助 备选方案1:将实施以下措施: 由于这并没有成功地找到如何做到这一点,我开始创建以下两个简单的函数,选项2: function findIndexRow(range,fTe
function findIndexRow(range,fText){
for(var i = 0; i<range.length;i++){
for(var j = 0; j<range.length;j++){
if(range[i][j] == fText){
var fTextRow = i+1;
var fTextCol = j+1;
}
}
}
return fTextRow
}
function findIndexCol(range,fText){
for(var i = 0; i<range.length;i++){
for(var j = 0; j<range.length;j++){
if(range[i][j] == fText){
var fTextRow = i+1;
var fTextCol = j+1;
}
}
}
return fTextCol
}
因此,当我在主代码中调用它一次时,上面的方法是有效的,但当它第二次返回null
时,请在这里帮助解释为什么重新调用相同的函数不起作用
var text1Row = findIndexRow(SHTvalues,"text1");
var text1Col = findIndexCol(SHTvalues,"text1");
Logger.log(text1Row)
Logger.log(text1Col)
var text2Row = findIndexRow(SHTvalues,"text2");
var text2Col = findIndexCol(SHTvalues,"text2");
Logger.log(text2Col)
Logger.log(text2Row)
我不明白为什么我的日志会返回
text1Row
和text1Col
的正确值,但是当第二次调用时,text2Row
和text2Col
都会返回null
以下是一个脚本,当我在查找我需要的表格时,我用它来搜索我的电子表格希望它确实会阅读另一张表格,以获得要搜索的电子表格列表
function regexSearch(sObj) {
var ass=SpreadsheetApp.getActive();
var startRow=2;
var msrsh=ass.getSheetByName('MultiSearchResults');
msrsh.clearContents();
msrsh.appendRow(['Path','FileName','FileId','SheetName','CellA1Notation','Value','Pattern']);
msrsh.activate();
var sh=ass.getSheetByName('SelectedSpreadsheets');
var hA=sh.getRange(1,1,1,sh.getLastColumn()).getValues()[0];
var getArrayIndex={};
hA.forEach(function(e,i){getArrayIndex[e]=i;});
var rg=sh.getRange(startRow,1,sh.getLastRow()-startRow+1,sh.getLastColumn());
var ssA=rg.getValues();
var matches='';
var n=0
for(var k=0;k<ssA.length;k++) {
var fileid=ssA[k][getArrayIndex['FileId']];
var filename=ssA[k][getArrayIndex['FileName']];
var filepath=getFilePathFromId(ssA[k][getArrayIndex['FileId']]);
//Logger.log(fileid);
var ss=SpreadsheetApp.openById(fileid);
Logger.log(sObj.pattern);
var tf=ss.createTextFinder(sObj.pattern).useRegularExpression(true);
var all=tf.findAll();
for(var i=0;i<all.length;i++) {
if(i==0)n++;
matches+=Utilities.formatString('<br /><b>Path:</b> %s <b>Sheet:</b> %s <b>Cell:</b> %s <b>Value:</b> %s<hr width="100%"/>',filepath,all[i].getSheet().getName(),all[i].getA1Notation(),all[i].getValue());
msrsh.appendRow([filepath,filename,fileid,all[i].getSheet().getName(),all[i].getA1Notation(),all[i].getValue(),sObj.pattern]);
}
}
if(matches) {
sObj.matches=matches;
sObj.message=Utilities.formatString('<p>Pattern %s was found in %s spreadsheet out of a total of %s</p>',sObj.pattern,n,ssA.length);
}else{
sObj.message=Utilities.formatString('No Matches found for %s',sObj.pattern);
}
return sObj;
}
函数regexSearch(sObj){
var ass=SpreadsheetApp.getActive();
var startRow=2;
var msrsh=ass.getSheetByName('MultiSearchResults');
msrsh.clearContents();
appendRow(['Path','FileName','FileId','SheetName','cellanotation','Value','Pattern']);
msrsh.activate();
var sh=ass.getSheetByName('SelectedSpreadsheets');
var hA=sh.getRange(1,1,1,sh.getLastColumn()).getValues()[0];
var getArrayIndex={};
hA.forEach(函数(e,i){getArrayIndex[e]=i;});
var rg=sh.getRange(startRow,1,sh.getLastRow()-startRow+1,sh.getLastColumn());
var ssA=rg.getValues();
var匹配=“”;
var n=0
对于(var k=0;k我相信你的目标如下
- 您希望从Google电子表格中的工作表中搜索文本值,并检索找到的值的行号和列号
- 您希望使用TextFinder实现这一点
对于这个问题,这个答案如何
示例脚本:
注:
- 关于
我的日志返回text1Row和text1Col的正确值,但当第二次调用时,如果Sheet1
中有text1
和text2
的值,则text1Row、text1Col、text2Col和text2Row都返回null
,如果只有该值如果将text1
的值放入Sheet1
,则text1Col和text2Col具有值。但是text2Col和text2Row没有值(null
)。请注意这一点
- 但在这种情况下,当将'text1'的两个值放入单元格“A1”和“A2”时,只返回“A2”。也请注意这一点
- 在此示例脚本中,请启用V8
参考资料:
我能为您的问题做些什么吗?如果我的回答对您的情况没有帮助,我必须道歉并修改它。如果您能合作解决您的问题,我很高兴。我想考虑解决方案。
function regexSearch(sObj) {
var ass=SpreadsheetApp.getActive();
var startRow=2;
var msrsh=ass.getSheetByName('MultiSearchResults');
msrsh.clearContents();
msrsh.appendRow(['Path','FileName','FileId','SheetName','CellA1Notation','Value','Pattern']);
msrsh.activate();
var sh=ass.getSheetByName('SelectedSpreadsheets');
var hA=sh.getRange(1,1,1,sh.getLastColumn()).getValues()[0];
var getArrayIndex={};
hA.forEach(function(e,i){getArrayIndex[e]=i;});
var rg=sh.getRange(startRow,1,sh.getLastRow()-startRow+1,sh.getLastColumn());
var ssA=rg.getValues();
var matches='';
var n=0
for(var k=0;k<ssA.length;k++) {
var fileid=ssA[k][getArrayIndex['FileId']];
var filename=ssA[k][getArrayIndex['FileName']];
var filepath=getFilePathFromId(ssA[k][getArrayIndex['FileId']]);
//Logger.log(fileid);
var ss=SpreadsheetApp.openById(fileid);
Logger.log(sObj.pattern);
var tf=ss.createTextFinder(sObj.pattern).useRegularExpression(true);
var all=tf.findAll();
for(var i=0;i<all.length;i++) {
if(i==0)n++;
matches+=Utilities.formatString('<br /><b>Path:</b> %s <b>Sheet:</b> %s <b>Cell:</b> %s <b>Value:</b> %s<hr width="100%"/>',filepath,all[i].getSheet().getName(),all[i].getA1Notation(),all[i].getValue());
msrsh.appendRow([filepath,filename,fileid,all[i].getSheet().getName(),all[i].getA1Notation(),all[i].getValue(),sObj.pattern]);
}
}
if(matches) {
sObj.matches=matches;
sObj.message=Utilities.formatString('<p>Pattern %s was found in %s spreadsheet out of a total of %s</p>',sObj.pattern,n,ssA.length);
}else{
sObj.message=Utilities.formatString('No Matches found for %s',sObj.pattern);
}
return sObj;
}
var findText = "text1";
var sheet = SpreadsheetApp.openById('the-gsheet-id');
var CurrSheet = sheet.getSheetByName('Sheet1');
var SHTvalues = CurrSheet.createTextFinder(findText).findAll();
var result = SHTvalues.map(r => ({row: r.getRow(), col: r.getColumn()}));
console.log(result)