Google Apps Script For Loop Through Array Speed



我有一个函数的简单例子,我正在工作。我试图通过唯一的项目id的列循环。如果在另一个工作表的项目ID列中找到项目ID,则从数据表中提取相邻属性,并将它们分配到同一行中。我有一个函数,它可以工作,但是,这是一个基本的例子。在现实中,我需要为1000多行和更大的数据集这样做。目前运行时间为30-60分钟。我相信有一种更快的方法来处理数组,使用foreach和getvalues我只是不知道该怎么开始。如有任何帮助,我将不胜感激。

function example() {
var list = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("List");
var data = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Data")
var listendRow = list.getLastRow();
var dataendRow = data.getLastRow();
var dataid = data.getDataRange().getValue();
for (var i = 2; i <= listendRow; i++) {
for (var j = 2; j <= dataendRow; j++){
var idnum = [list.getRange(i, 2,listendRow).getValue()];
var id = data.getRange(j, 3).getValue();
var name = data.getRange(j, 4).getValue();
var weight = data.getRange(j, 5).getValue();
if (idnum == id){
list.getRange(i, 3).setValue(name);
list.getRange(i, 4).setValue(weight);
} 
}
}
} 

下面是表单的链接:https://docs.google.com/spreadsheets/d/1PPZKRXhiAAfFG1d-CU02MV_CSrqbdsCsyo_QADz5yiA/edit?usp=sharing

我相信你的目标是这样的。

  • 你的脚本工作正常。在这种情况下,您希望减少脚本的处理成本。

修改点:

  • 当我看到你的样本电子表格,V8运行时不使用。请启用V8运行时。当使用V8运行时,可以减少脚本的进程成本。

  • 在您的脚本中,getValuesetValue在循环中使用。在这种情况下,过程成本变得很高。Ref

  • SpreadsheetApp.getActiveSpreadsheet()可以一次申报。

为了减少你的脚本的处理成本,下面的修改如何?

修改脚本:

在运行此脚本之前,请启用V8运行时。

function example2() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var list = ss.getSheetByName("List");
var data = ss.getSheetByName("Data");
var obj = data.getRange("C2:E" + data.getLastRow()).getValues().reduce((o, [a, ...b]) => (o[a] = b, o), {});
var range = list.getRange("B2:B" + list.getLastRow());
var values = range.getValues().map(([b]) => obj[b] || [null, null]);
range.offset(0, 1, values.length, 2).setValues(values);
}
  • 当这个脚本运行时,从"数据"中检索值。并创建一个对象来搜索ID。并且,从"列表"中检索值。工作表和用于放入工作表的数组被创建。同时,数组被放到"List"表。

注意:

  • 当您尝试使用此脚本而不启用V8运行时,会出现类似Syntax error的错误。请小心点。

  • 修改后的脚本用于示例电子表格。如果您的实际电子表格与提供的示例电子表格结构不同,则可能无法使用此修改后的脚本。请小心点。

  • 如果你不能使用V8运行时,请测试以下修改后的脚本。

    function example2b() {
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var list = ss.getSheetByName("List");
    var data = ss.getSheetByName("Data");
    var obj = data.getRange("C2:E" + data.getLastRow()).getValues()
    .reduce(function (o, [a, b, c]) {
    o[a] = [b, c];
    return o
    }, {});
    var range = list.getRange("B2:B" + list.getLastRow());
    var values = range.getValues().map(function ([b]) { return obj[b] || [null, null] });
    range.offset(0, 1, values.length, 2).setValues(values);
    }
    

引用:

  • getvalue ()
  • setvalue(值)
  • reduce ()
  • map ()

最新更新