这是我第一次使用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 answer和these best practices,但是我还没有找到一个与我正在进行的转换类型非常接近的示例,以能够弄清楚如何在没有帮助的情况下应用这些实践。 / p>
如何使用批处理或缓存服务进行重构以减少函数调用的次数?
答案 0 :(得分:1)
此修改如何?我认为您的情况有几个答案。因此,请将此视为其中之一。
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);
}
setValues()
和appendRow()
之间的区别。如果结果不是您想要的,对不起。那时,您可以提供所需的样本输入和输出吗?由此,我想对其进行修改。