【问题标题】:Is there a difference in how Google Apps Script is interpreted when run as a Time-Driven script and when run from the Editor?作为时间驱动脚本运行和从编辑器运行时,Google Apps 脚本的解释方式是否有所不同?
【发布时间】:2022-01-13 15:06:04
【问题描述】:

我有一个 Google Apps 脚本函数,当从编辑器运行和在时间驱动脚本中运行时,它的解释似乎不同。当作为预定脚本运行时,它返回以下错误,坦率地说我不明白为什么。 错误异常:无效参数:yyyy-MM-dd'T'[object Object]:00Z at isBetweenTimeWithTz(Code:24:24)

当函数从编辑器运行时,我得到了我期望的输出,例如 0 '2022-01-13T00:50:00+0100' '2022-01-13T01:30:00+0100' 2022 年 1 月 12 日星期三 18:50:00 GMT-0500(东部标准时间) 1 月 12 日星期三2022 年 19:30:00 GMT-0500(东部标准时间)

function isBetweenTimeWithTz(from_t="00:50", to_t="01:30", tz="Europe/Prague"){
  now = new Date();
  from_str = Utilities.formatDate(now, tz, `yyyy-MM-dd'T'${from_t}:00Z`);
  to_str = Utilities.formatDate(now, tz, `yyyy-MM-dd'T'${to_t}:00Z`);

  from_dt = new Date(from_str);
  to_dt = new Date(to_str);

  is_between = from_dt <= now & now <= to_dt;

  console.log(is_between, from_str, to_str, from_dt, to_dt);

  return is_between;
}

对于调度,我使用这个函数:

function createTimeDrivenTriggers() {
    ScriptApp.newTrigger('isBetweenTimeWithTz')
      .timeBased()
      .everyMinutes(1)
      .create();

    console.log("Trigger triggered");
}

【问题讨论】:

    标签: google-apps-script


    【解决方案1】:

    我在打印参数时注意到的不同之处在于,时间驱动脚本中的第一个参数被以下内容覆盖:

    {authMode=FULL, second=3.0, triggerUid=2100292014431267688, minute=24.0, timezone=UTC, hour=16.0, day-of-month=13.0, day-of-week=4.0, week-of-year=2.0, month=1.0, year=2022.0}
    

    为避免第一个参数被覆盖,您可以添加一个包含上述值的占位符参数。

    修改:

    function isBetweenTimeWithTz(placeholder="", from_t="00:50", to_t="01:30", tz="Europe/Prague"){
    

    输出:

    【讨论】:

    • 很好的提示,非常感谢!您是否碰巧知道这是错误还是 Google Apps 脚本功能?
    • 我重写了我的原始代码,以便预定函数没有任何似乎可以解决问题的参数。再次感谢您的敏锐观察。
    • @Jakub.Novotny,我不能确定这是否是错误。我没有遇到任何提到它的覆盖功能的文档。我什至从未想过它会在测试之前覆盖第一个参数。如果这是一项功能,则应在其开头提及,因为不知道这将对整个脚本产生负面影响。
    • 在尝试使用参数调度函数时收到警告会很好。即使 Google Apps 脚本出错,我也不介意。比函数出现意外行为时要好得多。
    • 这是所有触发器的文档化功能。我习惯将e 作为我可能从触发器启动的任何函数的第一个参数。
    【解决方案2】:

    所有触发的函数都传递了一个event 参数,如文档中的here

    当触发器触发时,Apps 脚本将事件对象作为参数传递给函数,通常称为e

    在触发器执行中使用来自该参数的数据有时很有用。 The event object for a timed trigger 包含有关触发器启动时间的数据。

    【讨论】:

    • 所以它毕竟是一个功能 :-)) 我当然可以看到使用事件参数中的数据的用例,但我仍然无法理解我正在传递函数的事实被 e 覆盖的命名参数。为什么添加 e 作为第一个参数,而不是最后一个?
    • 我认为 e 默认为第一个参数,这就是它被覆盖的原因。我也在使用这个参数,我今天才知道它覆盖了第一个参数。我正在使用它,但我没有传递其他参数,所以我没有遇到这个问题。
    • @Jakub.Novotny 在 JavaScript 中,具有默认值的参数(“命名”参数)仍然是位置参数。触发机制调用类似isBetweenTimeWithTz(e) 的东西。 isBetweenTimeWithTz 的第一个参数,无论其名称如何,都将被赋值为e,由于签名中的其他参数不存在,它们将被赋值为null。如果您在自己的脚本中调用 isBetweenTimeWithTz('test') 然后记录参数值,您可以看到这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多