【问题标题】:Date object's type differs type between manual/scheduled execution = Cannot find method formatDate((class),string,string)日期对象的类型在手动/计划执行之间有所不同 = 找不到方法 formatDate((class),string,string)
【发布时间】:2019-11-22 20:46:21
【问题描述】:

我一直面临 google 脚本的一个额外问题。下面是通俗易懂的sn-p:

//https://stackoverflow.com/a/7390612/2873381
function typeOf(obj) {
  return {}.toString.call(obj).split(' ')[1].slice(0, -1).toLowerCase();
}
function run(working_day){
  if (!working_day){
     working_day = new Date();
  }
  console.log("working_day");
  console.log(typeOf(working_day));
  console.log(working_day);
  var timeZone   = Session.getTimeZone();
  var curr_day   = Utilities.formatDate(working_day, timeZone, "F");
  var curr_hour  = Utilities.formatDate(working_day, timeZone, "H");
  console.log(curr_day);
  console.log(curr_hour);
}

如果没有提供working_day,这个sn-p 会得到now。一旦它有一个有效的Date 实例,它就会尝试使用Utilities 方便的函数来获取星期几和当前时间。
如果我从编辑器手动运行这个 sn-p,没有问题,输出是预期的 .
但是,如果我设置一个 crontab 执行,比如说每小时,这段代码会引发错误
这里最奇怪的一点是出乎意料的javaobject 值,我不知道为什么working_day 会得到这个实例类型......
你能帮助我吗?谢谢

【问题讨论】:

  • 当您开始使用基于时间的触发器时,您的参数已被事件对象填充。
  • 感谢您准确指出线索!我添加了一个简单的 if 检查类型,允许脚本知道它是计划运行还是手动运行。 //time-triggered execution if (typeOf(working_day)=="javaobject"){ working_day = getNow(); }有更优雅的解决方案吗?
  • 就用working_day = new Date();?

标签: date google-apps-script


【解决方案1】:

您的函数 run() 可能会调用其他需要时区、当前星期几和当前小时的函数。在这种情况下,由于触发器报告星期几的方式,我可能会完全避免使用事件对象并这样做。

function run(){
  var dt=new Date();
  var timeZone   = Session.getScriptTimeZone();
  var curr_day   = dt.getDay();//0=Sunday 6=Saturday 
  var curr_hour  = dt.getHours();0-23
  Logger.log('%s,%s,%s',timeZone,curr_day,curr_hour);
}

因此,无论是通过基于计时器的触发器触发还是手动运行,它都会以相同的方式运行。这将需要更长的时间,但不会太多。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-31
    • 1970-01-01
    • 2011-01-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多