【问题标题】:Google Apps: Duplicate template sheet and delete old sheetGoogle Apps:复制模板表并删除旧表
【发布时间】:2012-08-02 16:20:57
【问题描述】:

问候 stackoverflow 社区,

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

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 概览中再次打开它时,脚本只会复制“模板”工作表,但函数的其余部分不再执行。

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

最好的问候, 吕迪格

【问题讨论】:

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


    【解决方案1】:

    我认为问题在于“暂时”您有两张同名的工作表。 A 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);
    }
    

    【讨论】:

      【解决方案2】:

      感谢您对flush() 函数的建议;虽然它没有解决问题,但我发现了我们的两个脚本都无法正常工作的真正原因(我的实际上也是如此,只是没有注意到)。

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

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

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

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

      干杯,吕迪格

      【讨论】:

      • 嗯.. 我很高兴我能帮上忙。但顺便说一句,我的版本确实适用于我的测试:)
      猜你喜欢
      • 2021-03-19
      • 1970-01-01
      • 2023-04-05
      • 1970-01-01
      • 2016-10-21
      • 2015-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多