经过大量的研究和挖掘通过谷歌应用程序脚本的微薄的文档,这是我已经找到了唯一的方式来迭代数据从谷歌表。有没有人知道,如果列可以转换为数组和迭代后更有效?下面的功能工作,但不是非常快。
function Recon(){
var currentValue;
var countAdvice = 0;
var lastValue = null;
var lastLine;
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Transactions");
var rowCount = spreadsheet.getLastRow();
spreadsheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Dashboard")
spreadsheet.getRange('D1').setValue(rowCount);
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Transactions");
for(var i = rowCount; i>1; i--){
currentValue = spreadsheet.getRange('G'+i).getValue();
if( lastValue != null && currentValue == (lastValue*(-1))){
spreadsheet.getRange('M'+i).setValue('okay');
spreadsheet.getRange('K'+i).setValue(currentValue);
spreadsheet.getRange('L'+i).setValue(lastValue);
spreadsheet.getRange('M'+lastLine).setValue('okay');
countAdvice++;
}
lastValue = currentValue;
lastLine = i;
}
spreadsheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Dashboard")
spreadsheet.getRange('E1').setValue(countAdvice);
}
每当你调用getRange()时,你都是在做一个HTTP调用,然后必须出去,获取数据,然后解析它。最好的做法是在大型数据集中取一次数据,然后也写一次。
你的代码中还有一些其他问题。
请看下面的方法,基本可以做到1次取调用,1次写调用。
var transSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Transactions");
var allRows = transSheet.getDataRange().getValues();
var outputArray = [];
// run through each row
allRows.forEach( function(row) {
var currentValue = row[6]; // column
// if some condition applies
if( currentValue == "whatever" ){
// place values in certain columns in that particular row
outputArray.push( ["this goes into col K", "this into col L", "this goes into col M" ] )
} else {
// place empty values in those columns
outputArray.push( ["", "", "" ])
}
});
// now the output is ready to be inserted
var startInsertingAtThisColumn = 7; // G
var writeOutputToSheet = transSheet.getRange( 1, startInsertingAtThisColumn, outputArray.length, outputArray[0].length ).setValues( outputArray );
引用- getDataRange