优化Google Apps脚本中的读取/写入

时间:2018-07-15 00:59:37

标签: google-apps-script

这是我第一次使用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]);
    }

它按预期工作,但是现在我可以调用google应用进行所有读/写操作;我已经阅读了this answerthese best practices,但是我还没有找到一个与我正在进行的转换类型非常接近的示例,以能够弄清楚如何在没有帮助的情况下应用这些实践。 / p>

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

1 个答案:

答案 0 :(得分: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()之间的区别。

参考文献:

如果结果不是您想要的,对不起。那时,您可以提供所需的样本输入和输出吗?由此,我想对其进行修改。