【问题标题】:Monthly Sheet Duplication via Time Trigger通过时间触发器复制月度工作表
【发布时间】:2022-01-07 13:15:24
【问题描述】:

我有一个电子表格来跟踪每月的会员资格和付款情况。我在月底复制工作表,将其重命名为日期并将其锁定以存档。我有一个 marco 记录和设置来执行此操作,并且在工作表上有一个按钮可以单击执行此操作。效果很好。

但是,我想让这个脚本通过我在谷歌脚本的 Tigger 区域中设置的时间触发。但是当它运行时,它失败了,我收到以下错误:

例外:请先选择一个活动工作表。 在存档表(宏:5:15)

这是我的代码:

function ArchiveSheet() {
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet()
spreadsheet.duplicateActiveSheet();
var sheetname = Utilities.formatDate(new Date(), Session.getScriptTimeZone(), "MMM/yyyy");
spreadsheet.getActiveSheet().setName("Archive "+ sheetname);
spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Current Month'), true);
spreadsheet.getRange('J3:J263').activate();
};

任何帮助将不胜感激。

【问题讨论】:

    标签: google-apps-script google-sheets time triggers archive


    【解决方案1】:

    带触发器的工作表复制

    function myfunk101() {
      const ss = SpreadsheetApp.getActive();
      const sh = ss.getSheetByName('Sheet0');
      sh.activate();
      const nsh = ss.duplicateActiveSheet();
      const n = Utilities.formatDate(new Date(), Session.getScriptTimeZone(), "HH:mm:ss");
      nsh.setName("Archive " + n);
    };
    

    活动工作表始终是 ss.getSheets()[0],因此最好按名称选择。而且它不会在当前会话中激活工作表,因为它运行的实例仅在服务器上打开。

    function createTriggerFormyfunk101() {
      if (ScriptApp.getProjectTriggers().filter(t => t.getHandlerFunction() == 'myfunk101').length == 0) {
        ScriptApp.newTrigger('myfunk101').timeBased().everyMinutes(5).create();//I used every five minutes because I didn't want to wait for the end of the month
      }
    }
    

    我认为这是一个更好的方法:

    function myfunk101() {
      const ss = SpreadsheetApp.getActive();
      const sh = ss.getSheetByName("Sheet0");//Pick your sheet
      ss.insertSheet(Utilities.formatDate(new Date(), Session.getScriptTimeZone(), "HH:mm:ss"), {template: sh});//change you time format for your name.  Since I was running 5 minute triggers I wanted more precision.
    };
    

    【讨论】:

    • 感谢您的回复。第一组代码对我来说似乎对我正在尝试做的事情最有意义,只是一个月的工作表存档。也就是说,当我尝试 sh.active();fails 脚本时。
    • 没有方法active()。这两种方法都对我有用,所以如果你不能让它工作,我帮不了你太多,除非你能提供一个具体的错误信息和行号。
    【解决方案2】:

    getActiveSpreasheet() 只能用于有界脚本或更改、编辑和以编程方式创建的开放式可安装触发器,在时间驱动的触发器上,您必须使用以下选项之一

    • open(file)(这个应该和DriveApp / Advanced Drive Service一起使用
    • openById(id)
    • openByUrl(url)

    相关

    【讨论】:

    • 谢谢。我该如何正确实施呢?我试过了,但遇到了身份验证问题?我不明白如何工作。如果我做对了,我想我只需要在顶部添加:var ss = SpreadsheetApp.openById("sheetid");//sheetid gets replaced with the right sheet id,其余的应该可以吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-16
    • 1970-01-01
    • 2015-04-20
    相关资源
    最近更新 更多