Google apps script 脚本末尾的copyToRange(及类似)执行?
我正在写一张很大的表格,我想通过谷歌应用程序脚本定期(每周)更新。 每周我都需要在工作表的“末尾”(lastDataColumn)添加一个新列,然后将最后两列(用公式计算每周的相对变化)移动到“末尾”(即将它们向右移动一列)。这给我留下了一个空白列,地址是lastDataColumn-2。这就是新报告数据的去向 我有两个功能。 copyCols和getReports 它们各自工作正常,因此copyCols使用上述方法在lastDataColumn-2位置创建一个新的空列,getReports从分析、第三方API和其他表单获取报告数据,然后将这些值写入lastDataColumn-2位置的列中 然而,如果我将这两个函数组合在我的主函数中,然后我想在7天的基础上触发它,那么copyCols似乎只执行到创建一个新的空列的程度。然后getReports完全执行并将所有数据写入lastDataColumn-2。但没有移动任何列,因此getReports会覆盖上周的数据。从getReports执行所有操作后,copyCols开始移动行(即复制)。 这使我在lastDataColumn-2中有一个重复的lastDataColumn-3列(该列应该有最近几周的数据,但由于在执行getReports之前它仍然在lastDataColumn-2中,所以被本周的数据覆盖) 澄清一下:之后执行copyCols和getReports(各自独立)效果非常好。 谷歌应用程序脚本是无线程的吗?如果是,为什么会出现所描述的问题?脚本末尾是否执行“批量”操作(如复制范围) 代码:Google apps script 脚本末尾的copyToRange(及类似)执行?,google-apps-script,google-sheets,Google Apps Script,Google Sheets,我正在写一张很大的表格,我想通过谷歌应用程序脚本定期(每周)更新。 每周我都需要在工作表的“末尾”(lastDataColumn)添加一个新列,然后将最后两列(用公式计算每周的相对变化)移动到“末尾”(即将它们向右移动一列)。这给我留下了一个空白列,地址是lastDataColumn-2。这就是新报告数据的去向 我有两个功能。 copyCols和getReports 它们各自工作正常,因此copyCols使用上述方法在lastDataColumn-2位置创建一个新的空列,getReports从分
var today=新日期();
var start=新日期(today.getTime()-7*24*60*60*1000);
var end=新日期(today.getTime()-1*24*60*60*1000);
var dateString=Utilities.formatDate(开始,Session.getScriptTimeZone(),'dd.MM')+'-'+Utilities.formatDate(结束,Session.getScriptTimeZone(),'dd.MM'))
var nc=2//col的数量,增长率将移动
函数main(){
copyCols();
getReports();
}
函数copyCols(){
var ss=SpreadsheetApp.openById('1dSpy7teczLwViKbfr-VjfQRuOq3iaRfSm3LghFldjZk')
var sh_DB=ss.getSheetByName('数据')
var w=sh_DB.getLastColumn();//宽度
var h=sh_DB.getLastRow();//高度
//插入新列
sh_DB.insertColumnAfter(w);
//将最后n列复制到下一列
对于(i=0;i在copyCols()和getReports()之间添加)
以便告诉Google应用程序脚本引擎在运行第二个脚本之前应用第一个脚本所做的更改。您是否可以查看执行记录并查看是否存在与最大执行时间相关的错误,因为应用程序脚本不太适合处理电子表格中的大量数据,并且在pr时可能会比较慢处理它?执行协议没有问题…除了我的帖子之外-根据执行,transscript copyToRange在调用时正确执行(不是在最后看起来像是在工作表中进行了顺序更改),并且没有任何问题导致执行时间(零点秒)。请在for的for循环中插入一个Logger.log(“Copy exec:”+i)
。
将函数copyCols()
中的最后n列复制到下一列,并查看当实际从main()调用copyCols()
时,日志会说些什么
。这正是我想要的。不知何故,我从未在文档中读到过这方面的内容。有什么方法可以告诉我哪些操作捆绑在一起吗?好的,没有,但不是执行循环来多次调用电子表格应用程序类,而是一次获取/设置多个值,也就是说,不是。setValue(value)
使用设置值(值)
。
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]);
}
}