Google apps script 超过了google apps脚本中的最大执行时间

Google apps script 超过了google apps脚本中的最大执行时间,google-apps-script,google-sheets,Google Apps Script,Google Sheets,我有两张电子表格。我想将电子表格1的C列与电子表格2的A列匹配。这两个电子表格都有超过8000条记录。由于记录数量巨大,我的脚本不断给出超出最大执行时间的错误。这是剧本 function compare() { var ss=SpreadsheetApp.getActiveSpreadsheet(); var sheetList1=ss.getSheetByName("spreadsheet1"); var sheetList2=ss.getSheetByName("spreadshe

我有两张电子表格。我想将
电子表格1
的C列与
电子表格2
的A列匹配。这两个电子表格都有超过8000条记录。由于记录数量巨大,我的脚本不断给出
超出最大执行时间的错误。这是剧本

function compare() {

var ss=SpreadsheetApp.getActiveSpreadsheet();
  var sheetList1=ss.getSheetByName("spreadsheet1");
  var sheetList2=ss.getSheetByName("spreadsheet2");

   var sheet1Data=sheetList1.getRange(2,3,sheetList1.getLastRow(),1).getValues();

   var sheet2Data=sheetList2.getRange(1,1,sheetList2.getLastRow(),1).getValues();

   for (i in sheet2Data){
    var row = 2;
      for (j in sheet1Data){
        if (sheet1Data[j][0]==sheet2Data[i][0]){
           sheetList1.getRange("A"+row).setValue('Inactive');           
        }
        row++;
      }


   }

}
任何优化此脚本的建议。或者如何处理这个错误? 提前感谢:)

编辑

谢谢你的精彩回复。有一个问题。如果我在
If
语句之前将数据推入
newSheet1Data
数组,那么它会写入
Inactive
两次。i、 e如果有两行,它将
非活动的
写入四行

newSheet1Data.push(sheet1Data[j]); 
        if (sheet1Data[j][2]==sheet2Data[i][0]){
          newSheet1Data[j][0]='Inactive';
        }
如果我在
语句中推送数据,但没有出现匹配,则它找不到行并给出此错误
TypeError:无法将未定义的属性“0.0”设置为“不活动”
。像

if (sheet1Data[j][0]==sheet2Data[i][0]){
           newSheet1Data.push(sheet1Data[j]);
           newSheet1Data[j][0]='Inactive';           
        }

您应该避免在循环中调用任何电子表格API,尤其是当您有这么多数据时

其思想是只处理数组,并在完成后将结果写回。 下面的代码执行此操作(基于您的代码,如果C列sheet1中的数据与sheet2列A中的数据相同,则在sheet1列A中写入字符串)。 我希望我没有犯错误,但我没有机会测试我的代码。。。它可能需要一些调试;-)

函数比较(){
var ss=SpreadsheetApp.getActiveSpreadsheet();
var sheetList1=ss.getSheetByName(“Sheet1”);
var sheetList2=ss.getSheetByName(“Sheet2”);
var sheet1Data=sheetList1.getDataRange().getValues();//在数组中获取整个工作表
var sheet2Data=sheetList2.getRange(1,1,sheetList2.getLastRow(),1.getValues();
var newSheet1Data=[];//创建新数组以收集数据

对于(i=0;isorry,我在代码中输入了一个错误,最后一行od代码:当然必须使用sheetName才能使用.getRange(),我更新了我的答案。我最终测试了它,这个版本如预期的那样工作,循环不适合这个逻辑。你确定吗?数据只被推送一次…如果你得到一行的两个副本,我真的不知道为什么。你能分享一份你的电子表格看看发生了什么,或者至少一个数据样本来测试吗?我的测试运行良好。顺便说一句更改推送位置后出现的错误是正常的,您尝试写入的行此时不存在。它必须先出现。另外:我在代码中添加了一行以加快速度(稍微快一点!)请参见中断;+注释仍需要5分钟的时间。如果数据稍多,我猜脚本将再次停止工作。
function compare() {
  var ss=SpreadsheetApp.getActiveSpreadsheet();
  var sheetList1=ss.getSheetByName("Sheet1");
  var sheetList2=ss.getSheetByName("Sheet2");
  var sheet1Data=sheetList1.getDataRange().getValues();// get the whole sheet in an array
  var sheet2Data=sheetList2.getRange(1,1,sheetList2.getLastRow(),1).getValues();
  var newSheet1Data = [] ; // create a new array to collect data
   for (i=0;i<sheet1Data.length;++i){
      for (j=0;j<sheet2Data.length;++j){
      if(i!=j){continue};
        newSheet1Data.push(sheet1Data[i]); // add the full row to target array
        if (sheet1Data[i][2]==sheet2Data[j][0]){
          newSheet1Data[i][0]='Inactive';//if condition is true change column A
          break
        }
      }
   }
  newSheet1Data.shift();// remove first row (probably headers ?)
  sheetList1.getRange(2,1,newSheet1Data.length,newSheet1Data[0].length).setValues(newSheet1Data);  // write back to sheet1 in one batch
} 
function compare() {
  var ss=SpreadsheetApp.getActiveSpreadsheet();
  var sheetList1=ss.getSheetByName("Sheet1");
  var sheetList2=ss.getSheetByName("Sheet2");
  var sheet1Data=sheetList1.getDataRange().getValues();// get the whole sheet in an array
  var sheet2Data=sheetList2.getRange(1,1,sheetList2.getLastRow(),1).getValues();
  var newSheet1Data = [] ; // create a new array to collect data
  for (i=0;i<sheet1Data.length;++i){
    newSheet1Data.push(sheet1Data[i]); // add the full row to target array
       for (j=0;j<sheet2Data.length;++j){
         if (sheet1Data[i][2]==sheet2Data[j][0]){
          newSheet1Data[i][0]='Inactive';//if condition is true change column A
          break;// don't continue after condition was true, this will speed up the process
        }
      }
   }
  newSheet1Data.shift();// remove first row (probably headers ?)
  sheetList1.getRange(2,1,newSheet1Data.length,newSheet1Data[0].length).setValues(newSheet1Data);  // write back to sheet1 in one batch
}