谷歌应用程序脚本在电子表格中查找文本并返回位置索引。

问题描述 投票:0回答:1

我是一个新手,在这里谷歌应用程序脚本和我的JavaScript也不是很强,但这些似乎都不是问题,因为我的代码工作,我第一次运行它,但当我试图再次调用它,它失败了。

简单地说,我试图有一个函数,可以动态地在给定的范围内找到一个给定的文本。虽然看起来可能有一个内置的包可以做到这一点,但我不知道如何实现它。而且文档对于一个新手来说也没有什么帮助。

方案一:是实现以下功能。https:/developers.google.comapps-scriptreferencespreadsheettext-finder#findAll()

由于一直没有成功的找到方法,我转而创建了下面简单的两个函数,方案2。

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
}

它接收一个我定义的范围,比如:

var sheet = SpreadsheetApp.openById('the-gsheet-id');
var CurrSheet = sheet.getSheetByName('Sheet1');
var SHTvalues = CurrSheet.getDataRange().getValues();

所以当我在我的主代码中调用它一次时,上面的函数就会工作,但第二次它就会返回。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)

我不明白为什么我的日志会返回正确的值,如 text1Rowtext1Col 但当它第二次被调用时 text2Rowtext2Col 双双返回 null

javascript google-apps-script find
1个回答
1
投票

我相信你的目标如下。

  • 你想从Google Spreadsheet中的一个表中搜索一个文本值,并想检索找到的值的行号和列号。
  • 你想用TextFinder来实现。

对此,这个答案如何?

脚本示例。

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)

注意:

  • 关于 my logs return the correct values for text1Row and text1Col but when it is called a second time the text2Row and text2Col both return null 的值,如果在你的脚本中,有 text1text2Sheet1,text1Row、text1Col、text2Col和text2Row的值。如果只有 text1 放在 Sheet1,text1Col和text2Col有值。但是text2Col和text2Row没有值(null). 请注意这一点。

    • 但是在这种情况下,当把2个`text1的值放到 "A1 "和 "A2 "单元格时,只返回 "A2"。这一点也请注意。
  • 在这个示例脚本中,请启用V8。

参考文献。


0
投票

这是一个脚本,当我找不到我想要的表时,我用来搜索我的电子表格。 它确实可以读取另一张表,以获得一个电子表格列表来进行搜索。

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;
}
© www.soinside.com 2019 - 2024. All rights reserved.