我正在制作一张大片,我想通过Google Apps Scripts定期(每周)更新一次。 每周我需要在工作表的“end”(lastDataColumn)添加一个新列,然后将最后两个colums(使用Fomulas计算每周相对更改)移动到“end”(即将它们向右移动一列) )。这留下了一个用lastDataColumn-2寻址的空白列。这是新报告数据的来源。
我有两个功能。 copyCols和getReports。
它们都可以自行运行,因此copyCols使用上述方法在lastDataColumn - 2位置创建一个新的空列 - getReports从Analytics,第三方API和其他工作表中提取报告数据,然后将这些值写入位于lastDataColumn - 2的列。
但是,如果我将这两个函数组合在一起,让我说我的主函数,然后我想在7天的基础上触发,copyCols似乎只执行到创建一个新的空列。然后getReports完全执行并将所有数据写入lastDataColumn - 2.但是没有移动列,因此getReports会覆盖上周的数据。从getReports执行所有操作后,copyCols开始移动行(即复制)。 这给我留下了一个重复的lastDataColumn - 3列(它应该有上周的数据,但在lastDataColumn - 2中被覆盖了这周的数据,因为它仍然在执行getReports之前的lastDataColumn - 2中)。
澄清一下:之后执行copyCols和getReports(每个都在它自己的上面)完全正常。
Google Apps脚本是否无线?如果是这样,为什么会出现问题呢? “批量”操作(如复制范围)是否在脚本末尾执行?
代码:
var today = new Date();
var start = new Date(today.getTime() - 7 * 24 * 60 * 60 * 1000);
var end = new Date(today.getTime() - 1 * 24 * 60 * 60 * 1000);
var dateString=Utilities.formatDate(start, Session.getScriptTimeZone(),'dd.MM.')+'-'+Utilities.formatDate(end, Session.getScriptTimeZone(),'dd.MM.')
var nc=2 //num of cols with growth rates to move
function main() {
copyCols();
getReports();
}
function copyCols(){
var ss=SpreadsheetApp.openById('1dSpy7teczLwViKbfr-VjfQRuOq3iaRfSm3LghFldjZk')
var sh_DB=ss.getSheetByName('data')
var w=sh_DB.getLastColumn(); //width
var h = sh_DB.getLastRow(); //heigth
// insert new column
sh_DB.insertColumnAfter(w);
// copy last n cols to next col
for (i=0;i<=nc;i++){
sh_DB.getRange(1,w-i,h,1).copyTo(sh_DB.getRange(1,w-i+1,h,1));
}
sh_DB.getRange(1,w-nc+1).setValue(dateString);
}
function getReports(){
var sh_DB=SpreadsheetApp.getActiveSpreadsheet().getSheetByName('data')
var w=sh_DB.getLastColumn(); //width
var h = sh_DB.getLastRow(); //heigth
dc=sh_DB.getRange(1,w-nc); //lastDataColumn
data = [50, 60, 870, 2];
report = {'rows':[2,3,4,5]};
for (i in data){
sh_DB.getRange(report['rows'][i],w-nc).setValue(data[i]);
}
}
感谢您提供的任何帮助。
答案 0 :(得分:2)
在copyCols()
和getReports()
之间添加SpreadsheetApp.flush(),以告知Google Apps脚本引擎在运行第二个之前应用第一个所做的更改。