【问题标题】:My Google App Script takes too long to end. Need to do it faster我的 Google App 脚本需要很长时间才能结束。需要做得更快
【发布时间】:2021-06-14 15:37:38
【问题描述】:

问题:- 我的脚本通常平均需要 5 分钟。我们可以更改代码中的任何内容以更快地传输数据吗?

它有什么作用?

  • 它将源工作表中填充的新数据传输到目标工作表的存储库中。源工作表数据每天都会刷新,但在目标工作表中,传输的数据会逐日追加。

这是脚本:

function UploadRepository() { 
  var sheet1 = SpreadsheetApp.openById("SourceSheet"); 
  var sheet2 = SpreadsheetApp.openById("DestinationSheet"); 
  var currDate = new Date(); 
  var editedDate = new Date(currDate - 86400000); 
  var insert = sheet1.getSheetByName("SourceSheetName"); 
  var archive = sheet2.getSheetByName("DestinationSheetName"); 
  var insertData = insert.getRange(2, 1, (sheet1.getRange('A:A').getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow()), 28); 
  for (row = 2; row <= insertData.getNumRows(); row++) { 
    var data = insert.getRange(row, 1, 1, 28).getValues(); 
    if (data[0][0] < currDate && data[0][0] > editedDate) { 
      archive.getRange((archive.getLastRow() + 1), 1, 1, 28).setValues(data).setNumberFormat("MM/dd/yyyy"); 
    } 
  }
}

【问题讨论】:

  • 你能看一下问题中的代码格式吗?目前无法读取。见formatting。还有一个预览功能,因此您可以在保存更改之前检查所有内容。

标签: google-apps-script google-sheets


【解决方案1】:

你能试试这个而不是你的for循环吗?

代码:

insertData = insertData.getValues().map(function(row){
  if(row[0] < currDate && row[0] > editedDate) 
    return row;
}).filter(Boolean);

archive.getRange(archive.getLastRow() + 1, 1, insertData.length, insertData[0].length).setValues(insertData).setNumberFormat("MM/dd/yyyy");

行为:

  • 过滤满足if 条件的insertData 值,然后立即设置archive 工作表的值,而不是在循环中逐个设置。

运行时的区别:

10 行:

50 行:

100 行:

注意:

  • 我没有为每个测试执行多次执行以获得平均运行时间,因为差异如此之大,几毫秒甚至都无关紧要。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多