Сценарии Google App находят текст в электронной таблице и возвращают индекс местоположения - PullRequest
0 голосов
/ 03 мая 2020

Я новичок здесь в скриптах приложений Google, и мой JavaScript также не очень силен, но ни одна из них не является проблемой, так как мой код работает при первом запуске, но потом, когда я пытаюсь вызвать это снова не удается.

Просто я пытаюсь использовать функцию, которая будет динамически находить данный текст в заданном диапазоне. Хотя, похоже, может быть встроенный пакет, который делает это, я не могу понять, как его реализовать. И документация не полезна для кого-то нового.

Вариант 1: было реализовать следующее: https://developers.google.com/apps-script/reference/spreadsheet/text-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)

Я не могу понять, почему мои журналы возвращают правильные значения для text1Row и text1Col, но при повторном вызове text2Row и text2Col оба возвращают null

Ответы [ 2 ]

1 голос
/ 03 мая 2020

Я считаю, что ваша цель заключается в следующем.

  • Вы хотите найти текстовое значение из листа в электронной таблице Google и хотите получить номера строк и столбцов найденных значений.
  • Вы хотите добиться этого с помощью 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 в вашем скрипте, если есть значения text1 и text2 в Sheet1, text1Row, text1Col, text2Col и text2Row имеют значения. Если в Sheet1 введено только значение text1, то text1Col и text2Col имеют значения. Но text2Col и text2Row не имеют значений (null). Пожалуйста, будьте осторожны.

    • Но в этом случае, когда 2 значения `text1 помещаются в ячейки" A1 "и" A2 ", возвращается только" A2 ". Также, пожалуйста, будьте осторожны.
  • В этом примере сценария, пожалуйста, включите V8.

Ссылки:

0 голосов
/ 03 мая 2020

Вот скрипт, который я использовал для поиска в своих электронных таблицах, когда у меня возникают проблемы с поиском нужного мне листа. Он читает другой лист, чтобы получить список таблиц для поиска.

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...