Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/431.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.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
Javascript 谷歌应用程序脚本在电子表格中查找文本并返回位置索引_Javascript_Google Apps Script_Find - Fatal编程技术网

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

Javascript 谷歌应用程序脚本在电子表格中查找文本并返回位置索引,javascript,google-apps-script,find,Javascript,Google Apps Script,Find,我是谷歌应用程序脚本的新手,我的JavaScript也不是很强,但这两个似乎都不是问题,因为我的代码在第一次运行时就可以工作,但当我尝试再次调用它时,它失败了 简单地说,我正在尝试使用一个函数,该函数将在给定的范围内动态查找给定的文本。虽然看起来可能有一个内置的包可以做到这一点,但我不知道如何实现它。而且这些文档对新手没有帮助 备选方案1:将实施以下措施: 由于这并没有成功地找到如何做到这一点,我开始创建以下两个简单的函数,选项2: function findIndexRow(range,fTe

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

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

备选方案1:将实施以下措施:

由于这并没有成功地找到如何做到这一点,我开始创建以下两个简单的函数,选项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
}
因此,当我在主代码中调用它一次时,上面的方法是有效的,但当它第二次返回
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)