Javascript 在谷歌表单中检查日期是否为假日

Javascript 在谷歌表单中检查日期是否为假日,javascript,google-apps-script,google-sheets,Javascript,Google Apps Script,Google Sheets,我从以下网站借用/修改了以下脚本。 这个脚本也没有以其原始形式工作。。。从语法上讲,它应该可以工作,但由于某种原因,Date()函数一直失败 我的问题是它在谷歌电子表格中不起作用。。我对主要问题有以下几点看法 无法正确设置endDate,结果总是如下日志所示 它在工作表中不被识别为自定义函数。i、 e=无法识别isJapaneseHolidy(somedate) 日志: [17-04-28 12:34:19:357 JST] Starting execution [17-04-28 12:

我从以下网站借用/修改了以下脚本。 这个脚本也没有以其原始形式工作。。。从语法上讲,它应该可以工作,但由于某种原因,Date()函数一直失败

我的问题是它在谷歌电子表格中不起作用。。我对主要问题有以下几点看法

  • 无法正确设置
    endDate
    ,结果总是如下日志所示

  • 它在工作表中不被识别为自定义函数。i、 e=无法识别isJapaneseHolidy(somedate)

日志:

[17-04-28 12:34:19:357 JST] Starting execution
[17-04-28 12:34:19:364 JST] Logger.log([Thu Jan 01 09:00:00 GMT+09:00 1970, []]) [0 seconds]
[17-04-28 12:34:19:364 JST] Logger.log([Thu Jan 01 09:00:00 GMT+09:00 1970, []]) [0 seconds]
[17-04-28 12:34:19:401 JST] CalendarApp.getCalendarById([ja.japanese#holiday@group.v.calendar.google.com]) [0.035 seconds]
[17-04-28 12:34:19:424 JST] Calendar.getEvents([Wed Dec 31 16:00:00 PST 1969, Wed Dec 31 16:00:00 PST 1969]) [0.022 seconds]
[17-04-28 12:34:19:425 JST] Execution succeeded [0.062 seconds total runtime]
function main() {
  Logger.log(isJapaneseHoliday(2017,5,3)); 
}

function isJapaneseHoliday(year, month, day) {   
  var startDate = new Date(year,month-1,day,0,0,0);
  Logger.log(startDate);
  var endDate = new Date(year,month-1,day,23,59,59,999);
  Logger.log(endDate);

  var cal=CalendarApp.getCalendarById("ja.japanese#holiday@group.v.calendar.google.com");
  var holidays =  cal.getEvents(startDate, endDate);

  return holidays.length != 0; 
}
功能:

[17-04-28 12:34:19:357 JST] Starting execution
[17-04-28 12:34:19:364 JST] Logger.log([Thu Jan 01 09:00:00 GMT+09:00 1970, []]) [0 seconds]
[17-04-28 12:34:19:364 JST] Logger.log([Thu Jan 01 09:00:00 GMT+09:00 1970, []]) [0 seconds]
[17-04-28 12:34:19:401 JST] CalendarApp.getCalendarById([ja.japanese#holiday@group.v.calendar.google.com]) [0.035 seconds]
[17-04-28 12:34:19:424 JST] Calendar.getEvents([Wed Dec 31 16:00:00 PST 1969, Wed Dec 31 16:00:00 PST 1969]) [0.022 seconds]
[17-04-28 12:34:19:425 JST] Execution succeeded [0.062 seconds total runtime]
function main() {
  Logger.log(isJapaneseHoliday(2017,5,3)); 
}

function isJapaneseHoliday(year, month, day) {   
  var startDate = new Date(year,month-1,day,0,0,0);
  Logger.log(startDate);
  var endDate = new Date(year,month-1,day,23,59,59,999);
  Logger.log(endDate);

  var cal=CalendarApp.getCalendarById("ja.japanese#holiday@group.v.calendar.google.com");
  var holidays =  cal.getEvents(startDate, endDate);

  return holidays.length != 0; 
}
以前有人经历过吗

编辑:

[17-04-28 12:34:19:357 JST] Starting execution
[17-04-28 12:34:19:364 JST] Logger.log([Thu Jan 01 09:00:00 GMT+09:00 1970, []]) [0 seconds]
[17-04-28 12:34:19:364 JST] Logger.log([Thu Jan 01 09:00:00 GMT+09:00 1970, []]) [0 seconds]
[17-04-28 12:34:19:401 JST] CalendarApp.getCalendarById([ja.japanese#holiday@group.v.calendar.google.com]) [0.035 seconds]
[17-04-28 12:34:19:424 JST] Calendar.getEvents([Wed Dec 31 16:00:00 PST 1969, Wed Dec 31 16:00:00 PST 1969]) [0.022 seconds]
[17-04-28 12:34:19:425 JST] Execution succeeded [0.062 seconds total runtime]
function main() {
  Logger.log(isJapaneseHoliday(2017,5,3)); 
}

function isJapaneseHoliday(year, month, day) {   
  var startDate = new Date(year,month-1,day,0,0,0);
  Logger.log(startDate);
  var endDate = new Date(year,month-1,day,23,59,59,999);
  Logger.log(endDate);

  var cal=CalendarApp.getCalendarById("ja.japanese#holiday@group.v.calendar.google.com");
  var holidays =  cal.getEvents(startDate, endDate);

  return holidays.length != 0; 
}
如果我对日期使用值而不是变量,我会得到一个有效的返回值

请参阅下面的第一个Logger.log输出,其中我使用了
var startDate=new Date(2012,12,12,0,0,0,0)
进行测试

[17-04-28 13:01:42:098 JST] Starting execution
[17-04-28 13:01:42:107 JST] Logger.log([Wed Dec 12 00:00:00 GMT+09:00 2012, []]) [0 seconds]
[17-04-28 13:01:42:108 JST] Logger.log([Thu Jan 01 09:00:00 GMT+09:00 1970, []]) [0 seconds]
[17-04-28 13:01:42:141 JST] CalendarApp.getCalendarById([ja.japanese#holiday@group.v.calendar.google.com]) [0.032 seconds]
[17-04-28 13:01:42:142 JST] Calendar.getEvents([Tue Dec 11 07:00:00 PST 2012, Wed Dec 31 16:00:00 PST 1969]) [0 seconds]
[17-04-28 13:01:42:146 JST] Execution failed: Event start time must be before event end time. (line 12, file "Code") [0.038 seconds total runtime]
EDIT2:

[17-04-28 12:34:19:357 JST] Starting execution
[17-04-28 12:34:19:364 JST] Logger.log([Thu Jan 01 09:00:00 GMT+09:00 1970, []]) [0 seconds]
[17-04-28 12:34:19:364 JST] Logger.log([Thu Jan 01 09:00:00 GMT+09:00 1970, []]) [0 seconds]
[17-04-28 12:34:19:401 JST] CalendarApp.getCalendarById([ja.japanese#holiday@group.v.calendar.google.com]) [0.035 seconds]
[17-04-28 12:34:19:424 JST] Calendar.getEvents([Wed Dec 31 16:00:00 PST 1969, Wed Dec 31 16:00:00 PST 1969]) [0.022 seconds]
[17-04-28 12:34:19:425 JST] Execution succeeded [0.062 seconds total runtime]
function main() {
  Logger.log(isJapaneseHoliday(2017,5,3)); 
}

function isJapaneseHoliday(year, month, day) {   
  var startDate = new Date(year,month-1,day,0,0,0);
  Logger.log(startDate);
  var endDate = new Date(year,month-1,day,23,59,59,999);
  Logger.log(endDate);

  var cal=CalendarApp.getCalendarById("ja.japanese#holiday@group.v.calendar.google.com");
  var holidays =  cal.getEvents(startDate, endDate);

  return holidays.length != 0; 
}
正如Jack Brown提到的,我需要运行main()函数才能使其正常工作。。。我是在执行日本国庆日的任务。默认情况下没有输入

另外有人提到GoogleSheets和GoogleCalendar互不允许访问。。。一定有办法

EDIT3:

Jack Brown回答了我的问题,我现在面临着不同的问题,但由于无法进行身份验证,我正在创建一个自定义菜单,并向其中添加功能

但是,对于那些试图在脚本中使用公共日历的人,请注意,显然他们(或者至少是日本的假日日历)在PST/PDT中进行输入,这会使输出看起来不正确。。。我还不知道这是否会影响结果

EDIT4:

[17-04-28 12:34:19:357 JST] Starting execution
[17-04-28 12:34:19:364 JST] Logger.log([Thu Jan 01 09:00:00 GMT+09:00 1970, []]) [0 seconds]
[17-04-28 12:34:19:364 JST] Logger.log([Thu Jan 01 09:00:00 GMT+09:00 1970, []]) [0 seconds]
[17-04-28 12:34:19:401 JST] CalendarApp.getCalendarById([ja.japanese#holiday@group.v.calendar.google.com]) [0.035 seconds]
[17-04-28 12:34:19:424 JST] Calendar.getEvents([Wed Dec 31 16:00:00 PST 1969, Wed Dec 31 16:00:00 PST 1969]) [0.022 seconds]
[17-04-28 12:34:19:425 JST] Execution succeeded [0.062 seconds total runtime]
function main() {
  Logger.log(isJapaneseHoliday(2017,5,3)); 
}

function isJapaneseHoliday(year, month, day) {   
  var startDate = new Date(year,month-1,day,0,0,0);
  Logger.log(startDate);
  var endDate = new Date(year,month-1,day,23,59,59,999);
  Logger.log(endDate);

  var cal=CalendarApp.getCalendarById("ja.japanese#holiday@group.v.calendar.google.com");
  var holidays =  cal.getEvents(startDate, endDate);

  return holidays.length != 0; 
}

我刚刚验证过,它似乎不影响结果,它只是显示PST/PDT时区的时间作为
getEvents()
函数的输入。输出似乎工作正常。

您可以尝试使用
cal.getEvents(startDate,endDate)
而不是使用
cal.getEventsForDay(date)
。这些守则可修订为:

函数main(){
Logger.log(isJapaneseHoliday(2017,5,3));
}
函数为japaneseholiday(年、月、日){
var日期=新日期(年、月、日);
Logger.log(日期);
var cal=CalendarApp.getCalendarById(“ja.japanese#holiday@group.v.calendar.google.com");
var holidays=cal.getEventsForDay(日期);
返回假期。长度!=0;

}
运行脚本编辑器时,您是运行函数
main()
还是
isJapaneseHoliday()
?我用▶ 按钮。至于为什么自定义函数不起作用,CalendarApp不能使用Run>Main来运行您的主函数。您是对的,它设置为正在运行的函数,而我没有运行Main。这比我自己的解决方案更干净。。。不再亲自使用这个了,但是知道它很好!谢谢