【问题标题】:Optimize read/write in Google Apps Script [duplicate]优化 Google Apps 脚本中的读/写 [重复]
【发布时间】:2018-12-22 23:28:42
【问题描述】:

这是我第一次使用 JS 或 Apps 脚本,我编写了一个工作脚本,它读取数据行,并根据每行中的一个值,将新行写入第二张表,如下所示:

(我已经简化了脚本,只包含了两个案例来演示转换——“输入”工作表有行,每行都有一个值“带”;该函数检查这个带值,并根据哪个带,将一组行写入输出)

function convertToOutput() {
var sheet = ss.getSheetByName('Input');
var output = ss.getSheetByName('Output');
var last = sheet.getLastRow();

output.getRange('A2:P').clearContent();
output.getRange('A2:P').setNumberFormat('@STRING@');

for(var i=2;i<last+1;i++){
  var courseCode = sheet.getRange(i,1).getValue();
  var sectionID= sheet.getRange(i,2).getValue();
  var band = sheet.getRange(i,3).getValue();

if( band == 'A')
   {
// insert rows for band into output
    var periodID = '1';
    var cycleDay = "#10100";
    output.appendRow([courseCode,sectionID,periodID,cycleDay]);

    var periodID = '2'
    var cycleDay = "#00001";
    output.appendRow([courseCode,sectionID,periodID,cycleDay]);

    var periodID = '7'
    var cycleDay = "#01000";
    output.appendRow([courseCode,sectionID,periodID,cycleDay]);
    }
if( band == 'B')
  {
// insert rows for band into output
    var periodID = '2';
    var cycleDay = "#10100";
    output.appendRow([courseCode,sectionID,periodID,cycleDay]);

    var periodID = '3'
    var cycleDay = "#00001";
    output.appendRow([courseCode,sectionID,periodID,cycleDay]);

    var periodID = '7'
    var cycleDay = "#00010"
    output.appendRow([courseCode,sectionID,periodID,cycleDay]);
    }

它按预期工作,但现在我让它为所有读/写调用谷歌应用程序;我已经阅读了this answerthese best practices,但我还没有找到一个与我正在做的转变足够接近的例子,以便能够弄清楚如何在没有帮助的情况下应用这些实践。

如何使用批处理或缓存服务进行重构,以减少我的函数进行的调用?

【问题讨论】:

    标签: optimization google-apps-script google-sheets


    【解决方案1】:

    这个修改怎么样?我认为您的情况有几个答案。因此,请将此视为其中之一。

    修改点:

    • 在 for 循环中使用 getValue()appendRow() 会导致更高的成本。所以我分别用getValues()setValues() 代替了它们。

    修改后的脚本:

    function convertToOutput() {
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var sheet = ss.getSheetByName('Input');
      var output = ss.getSheetByName('Output');
      output.getRange('A2:P').clearContent();
      output.getRange('A2:P').setNumberFormat('@STRING@');
      var values = sheet.getRange(2, 1, sheet.getLastRow() - 1, 3).getValues();
      var appendValues = [];
      var pattern1 = [["1", "#10100"], ["2", "#00001"], ["7", "#01000"]];
      var pattern2 = [["2", "#10100"], ["3", "#00001"], ["7", "#00010"]];
      values.forEach(function(e) {
        var temp = [];
        if (e[2] == 'A') {
          temp = pattern1.map(function(f) {return [e[0], e[1], f[0], f[1]]});
        } else if (e[2] == 'B') {
          temp = pattern2.map(function(f) {return [e[0], e[1], f[0], f[1]]});
        }
        if (temp.length > 0) {
          Array.prototype.push.apply(appendValues, temp);
        }
      });
      output.getRange(output.getLastRow() + 1, 1, appendValues.length, appendValues[0].length).setValues(appendValues);
    }
    

    注意:

    • 作为参考,您可以在here 看到setValues()appendRow() 之间的区别。

    参考资料:

    如果这个结果不是你想要的,我很抱歉。到时候能不能提供你想要的样例输入输出?至此,我想对其进行修改。

    【讨论】:

    • 这真是太棒了,谢谢你——我从采用这项技术并将其扩展到包含更复杂的数据中学到了很多东西
    • @zqe 感谢您的回复。我很高兴你的问题得到了解决。也谢谢你。
    猜你喜欢
    • 2014-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-05
    • 1970-01-01
    • 1970-01-01
    • 2012-10-20
    相关资源
    最近更新 更多