如何返回结果中的每一行?

时间:2019-07-07 06:14:27

标签: search google-apps-script google-sheets google-sheets-api

我创建了一个API,该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 个答案:

答案 0 :(得分:1)

您的代码每次都将数据复制到同一行:

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);
}

此脚本中唯一需要注意的是它将值写入表格而不是公式。