手动/计划执行之间日期对象的类型不同=找不到方法formatDate((class),string,string)

时间:2019-07-13 09:28:52

标签: date google-apps-script

我一直在遇到Google脚本的额外问题。波纹管易于理解的代码段:

//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);
}

如果未提供now,则此代码段将获得working_day。一旦具有有效的Date实例,它就会尝试使用Utilities方便的函数来获取工作日和当前时间。
如果我从编辑器手动运行此代码段,则没问题,输出是预期的。 ok
但是,如果我将crontab执行设置为每小时一次,则此代码会引发错误ko
最奇怪的一点是意外的javaobject值,我不知道为什么working_day会得到这种实例类型。...
你能帮助我吗?谢谢

1 个答案:

答案 0 :(得分:2)

大概您的函数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);
}

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