Как вернуть каждый отдельный ряд в результатах? - PullRequest
1 голос
/ 07 июля 2019

Я создал API, который выполняет поиск ключевого слова на листе 2 в электронной таблице и возвращает номер строки ячейки, в которой было найдено ключевое слово. Я хочу скопировать и вставить все строки из листа 2 влист 1. Я не могу заставить скрипт скопировать и вставить их все.

function executeSearch() {
  //establishing search sheet
  var SSS = SpreadsheetApp.openById('ID');
  var SS = SSS.getSheetByName('Sheet1');
  var searchTerm = SS.getRange('B3').getValue();
  //establishing the data sheet
  var DS = SSS.getSheetByName('Sheet2');


  var completeSearch = DS.createTextFinder(searchTerm).findAll();
  for (var i = 0; i < completeSearch.length; i++) {
    var range = completeSearch[i];    
    var resultsCells = range.getA1Notation(); //get the cell location of the search data cell
    var row = range.getRow(); //get the rows that the search data is in

DS.getRange(row, 1, 1, DS.getMaxColumns()).copyTo(SS.getRange(8, 1, 1, DS.getMaxColumns()));

  }

1 Ответ

1 голос
/ 07 июля 2019

Ваш код копирует данные в одну и ту же строку каждый раз:

DS.getRange(row, 1, 1, DS.getMaxColumns()).copyTo(SS.getRange(8, 1, 1, DS.getMaxColumns()));

Чтобы получить код для записи данных в новые строки, вы можете изменить его на:

DS.getRange(row, 1, 1, DS.getMaxColumns()).copyTo(SS.getRange(8 + i, 1, 1, DS.getMaxColumns()));

Но это неэффективно, когда у вас есть большое количество результатов.Вы постоянно вызываете лист для записи каждой строки.

Было бы более эффективно сначала записать все результаты поиска в массив.А затем вызвать лист только один раз, чтобы записать все данные в строки за один раз.

function executeSearch() {

  //establishing search sheet
  var SSS = SpreadsheetApp.openById('ID');
  var SS = SSS.getSheetByName('Sheet1');
  var searchTerm = SS.getRange('B3').getValue();

  //establishing the data sheet
  var DS = SSS.getSheetByName('Sheet2');  

  var completeSearch = DS.createTextFinder(searchTerm).findAll();
  var searchResults = []; // Create an array to store the values of the search results

  for (var i = 0; i < completeSearch.length; i++) {
    var range = completeSearch[i];
    var row = range.getRow(); //get the rows that the search data is in
    var values = DS.getRange(row, 1, 1, DS.getMaxColumns()).getValues();
    searchResults.push(values[0]);
  }

  SS.getRange(8, 1, searchResults.length, searchResults[0].length).setValues(searchResults);
}

Единственное, на что следует обратить внимание в этом сценарии, это то, что он будет записывать значения на лист, а неформулы.

...