copyToRange(和类似的)在脚本结束时执行?

时间:2016-02-23 10:24:35

标签: google-apps-script google-sheets

我正在制作一张大片,我想通过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]);
  } 
}

感谢您提供的任何帮助。

1 个答案:

答案 0 :(得分:2)

copyCols()getReports()之间添加SpreadsheetApp.flush(),以告知Google Apps脚本引擎在运行第二个之前应用第一个所做的更改。