快速循环遍历多个工作表以查找数据

时间:2013-07-19 16:34:58

标签: google-apps-script google-sheets custom-function

您好我正在尝试编写一个自定义函数,它接受一对单元格,循环遍历电子表格中的所有工作表,以查找相同的匹配单元格对,并从同一行返回另一个值。

背景;表0是所有LOA和ID组合(主要是位置和序列号)的主表,需要填写检查日期。执行这些检查的人员使用Google上的LOA-ID组合+检查数据更新其个人工作表驾驶。我试图让主表单在添加此数据时自动更新。

表格均采用相同的格式(LOA,第1和第2列中的ID,第14列中的检验日期)。这是一个自定义函数我使用它做我想要的,但工作痛苦缓慢。如何让这个跑得更快? PER CELL需要几秒钟;我需要运行超过10k +的单元格。

function findMatch(LOA,GRID) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheets = ss.getSheets();
  var returnDate = "not found"

  for (var sheetNum = 1; sheetNum < sheets.length; sheetNum++){
     var ws = ss.getSheets()[sheetNum]

       for (var count = 1; count<ws.getLastRow(); count++){
       if (ws.getRange(count,1,1,1).getValues()==LOA && ws.getRange(count,2,1,1).getValues()==GRID)
       {
       returnDate = ws.getRange(count,14,1,1).getValue()
       break;
       }
       else
    {
    }  
       }

  }
  Logger.log(returnDate)
  return returnDate

1 个答案:

答案 0 :(得分:4)

最佳做法是尽可能少地执行Spreadsheet Service调用,特别是避免在循环内部进行调用。相反,使用getValues()批量检索所有数据,并使用Javascript迭代该数据。

function findMatch(LOA,GRID)
{
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheets = ss.getSheets();
  var returnDate = "not found", data;

  for (var sheetNum = 1; sheetNum < sheets.length; sheetNum++)
  {
     data = sheets[sheetNum].getDataRange().getValues();
     for (var count = 1; count < data.length; count++)
     {
       if (data[count][0] == LOA && data[count][1] == GRID)
       {
       returnDate = data[count][13];
       break;
       }
     }

  }
  Logger.log(returnDate);
  return returnDate;
}