Google Apps:复制模板表并删除旧表

时间:2012-08-02 16:20:57

标签: google-apps-script google-sheets dashboard

问候stackoverflow社区,

我目前正在尝试使用Google Spreadsheets为我的团队构建一个仪表板,以便每周完成日常任务。到本周末,团队成员应该“重置”仪表板,但是我遇到了以下脚本的问题。该脚本应复制“TEMPLATE”表,删除旧仪表板并将新副本重命名为“Dashboard”:

function resetDashboard() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('TEMPLATE');
  sheet.copyTo(ss).setName('New Dashboard');
  ss.setActiveSheet(ss.getSheetByName('Dashboard'));
  ss.deleteActiveSheet();
  ss.setActiveSheet(ss.getSheetByName('New Dashboard'));
  ss.renameActiveSheet('Dashboard');
}

注意:“仪表板”表是电子表格中唯一可见的表格。

到目前为止,这个脚本运行正常。当我重新加载电子表格时,它仍在工作。

我的问题是,当我关闭电子表格并从GoogleDocs概述再次打开时,脚本只会复制“模板”表,但该功能的其余部分不再执行。

这是一个错误吗?我可以使用“更干净”的版本/脚本吗?

祝你好运, 吕迪格尔

2 个答案:

答案 0 :(得分:2)

我认为问题是“暂时”你有两张同名的床单。在重命名之前SpreadsheetApp.flush()可能是作业。试试这个:

function resetDashboard() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var newSheet = ss.getSheetByName('TEMPLATE').copyTo(ss);
  ss.setActiveSheet(ss.getSheetByName('Master'));
  ss.deleteActiveSheet();
  SpreadsheetApp.flush(); //this guarantees that the old sheet is deleted before we proceed
  newSheet.setName('Master');
  ss.setActiveSheet(newSheet);
}

答案 1 :(得分:0)

感谢您对flush()函数的建议;虽然它没有解决这个问题,但我发现了我们的两个脚本都没有工作的真正原因(我的确实做得很好,只是没注意到)。

这是deleteActiveSheet()函数已报告的问题:

Issue 1298: deleteActiveSheet() and copyTo() require .sleep(2000) to work reliably

目前唯一的解决方法似乎是Utilities.sleep()函数;可以找到一个示例here

感谢您的帮助,这让我想到了这一点。 :)

干杯,Rüdiger