【问题标题】:Google Sheet Script cycling through a sheet and adding new rows and textGoogle Sheet Script 循环浏览工作表并添加新行和文本
【发布时间】:2016-07-27 21:53:02
【问题描述】:

我在谷歌表格中创建了我的第一个函数。基本上我让它按照我想要的方式工作,但它达到了最大执行时间限制。我把代码贴在下面,我相信有几种方法可以优化它,让它运行得更快。

代码基本上循环通过工作表中的记录来添加图像文件名。每个产品有六个图像文件名,有时我需要添加新行来列出所有文件名,如下图所示:

function myFunction() {

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  var range = sheet.getDataRange();
  var values = range.getValues();

  var c = 1;

  for (var i=1; i<values.length; i++) {

    c = 1;

    do {
    c = c + 1;
    i = i + 1;
    } while (values[i+1][13] == values[i][13]);

    while (c < 6) {
    sheet.insertRowsAfter(i+1,1);
    c = c + 1;
    i = i + 1;
    sheet.getRange(i+1,1).setValue(values[i-1][0]);
    }

    range = sheet.getDataRange();
    values = range.getValues();


    if(c <= 6) {
      sheet.getRange(i-4,25).setValue(values[i-5][13] + "_main.jpg");
      sheet.getRange(i-3,25).setValue(values[i-5][13] + "_detail.jpg");
      sheet.getRange(i-2,25).setValue(values[i-5][13] + "_detail1.jpg");
      sheet.getRange(i-1,25).setValue(values[i-5][13] + "_detail2.jpg");
      sheet.getRange(i,25).setValue(values[i-5][13] + "_side.jpg");
      sheet.getRange(i+1,25).setValue(values[i-5][13] + "_back.jpg");
    }

    if(c > 6) {
      sheet.getRange(i-c+2,25).setValue(values[i-c+2][13] + "_main.jpg");
      sheet.getRange(i-c+3,25).setValue(values[i-c+2][13] + "_detail.jpg");
      sheet.getRange(i-c+4,25).setValue(values[i-c+2][13] + "_detail1.jpg");
      sheet.getRange(i-c+5,25).setValue(values[i-c+2][13] + "_detail2.jpg");
      sheet.getRange(i-c+6,25).setValue(values[i-c+2][13] + "_side.jpg");
      sheet.getRange(i-c+7,25).setValue(values[i-c+2][13] + "_back.jpg");
    }

}

【问题讨论】:

    标签: google-apps-script google-sheets


    【解决方案1】:

    一个大批量更新而不是一堆小更新

    您的问题是每次调用sheet.getRange 相对于磨坊代码的平均运行需要相当多的时间(~100 毫秒)。当您每个循环执行 10 次循环运行 100 次时,您的代码将运行几分钟,而它可能只需要几秒钟。

    按照article by google about best practices with google scripts 中的建议,加快速度的方法是获取所有这些小更新(每个sheet.getRange 调用)并将它们组合成一个大批量更新。

    例如,不要这样做:

    sheet.getRange(1, 1).setValue(1);
    sheet.getRange(2, 1).setValue(2);
    sheet.getRange(1, 2).setValue(3);
    sheet.getRange(2, 2).setValue(4);
    

    这样做:

    sheet.getRange(1, 1, 2, 2).setValue([[1, 2], [3, 4]]);
    

    如何使用您的代码进行操作

    首先在尽可能少的 I/O 调用中加载您需要的所有数据,就像使用 sheet.getDataRange().getValues() 所做的那样。

    接下来进行所有必要的计算,而无需读取和写入电子表格。如果需要,可以使用二维数组代替电子表格:

    data = [["A", "tire.jpg"], ["B", "fire.jpg"]];
    data[i+2][c-1] = values[3][8] + "_main.jpg";
    

    完成后,您可以一次将data 写入电子表格:

    sheet.getRange(1, 1, data.length, data[0].length).setValues(data);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-25
      • 1970-01-01
      相关资源
      最近更新 更多