无法使用此脚本在日历上创建事件

Not able to create event on Calendar with this script

我在 Google Sheet 单元格 U69、U70、X69 中分别有事件标题、开始日期和结束日期。

它说在脚本中执行成功但没有添加事件。

function calendar() {
  var spreadsheet = SpreadsheetApp.getActiveSheet();
  var eventCal = CalendarApp.getCalendarById("c_v6h2ud0dru0dqojch3103sue20@group.calendar.google.com");
  var name = spreadsheet.getRange('U69').getValue();
  var start = new Date(spreadsheet.getRange('U70').getValue());
  var end =  new Date(spreadsheet.getRange('X69').getValue());
  eventCal.createEvent(name,start,end);

  Logger.log('Reminder is added to your calendar');
}

编辑 2:

PS - 我在 sheet 上做这件事,我是它的所有者。我也在创建脚本。我是 运行,我在日历上看不到条目。
5 人可以访问 sheet。我已从日历设置部分授予对所有 5 个“进行更改和管理共享”的访问权限。

请帮忙。我究竟做错了什么?语法错误在哪里?我是否正确地为变量加上了引号?还是其他原因?

编辑 3: 我添加了 logger.log(日历)。它说在脚本中执行成功(根据附图),但没有添加事件。

function calendar() {
  var spreadsheet = SpreadsheetApp.getActiveSheet();
  var calendarId = spreadsheet.getRange("AA69").getValue();
  var eventCal = CalendarApp.getCalendarById("c_v6h2ud0dru0dqojch3103sue20@group.calendar.google.com");

  var name = spreadsheet.getRange('U69').getValue();
  var start = new Date(spreadsheet.getRange('U70').getValue());
  var end =  new Date(spreadsheet.getRange('X69').getValue());
  eventCal.createEvent(name,start,end);
  Logger.log(calendarId);
}

[![在此处输入图片描述][1]][1]

编辑 4: 我检查了 ISDATE() 公式。 U70 和 X69 都是 True。该代码还显示执行完成。 Logger.Log 也给出了正确的单元格值。

语法nw应该怎么办?活动仍未添加。

  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Course');
  var eventCal = CalendarApp.getCalendarById('c_v6h2ud0dru0dqojch3103sue20@group.calendar.google.com');
  var name = spreadsheet.getRange('U69').getValue();  

  var start = spreadsheet.getRange('U70').getDisplayValue(); 
  var end = spreadsheet.getRange('X69').getDisplayValue();
  eventCal.createEvent(name,new Date(start),new Date(end));
  Logger.log(end);
}

编辑 5: 迈克的回答对我有帮助。非常感谢,迈克

你有 eventCal.createEvent...... TypeError: Cannot read property 'createEvent' of null 的原因是 CalendarApp.getCalendarById(calendar id) returns null 如果日历不存在,如果用户不能访问它,或者如果用户没有订阅日历。

要解决此问题,请确保您具有对日历的编辑权限并重新运行您的代码。如果您有权访问日历,它应该 return 一个 Calendar Class 并且在那个 Calendar class 里面是 createEvent() 方法。

更新 #1:

鉴于 OP 也是日历的所有者,一个可能的原因是 var calendarId 的值不是日历的有效 ID。您可以尝试通过在其下方添加 Logger.log(calendarId) 来调试它,以检查您是否能够在单元格 AA69.

中获取日历 ID 的值

how to get the calendar ID 上关注此 link。

更新#2:

对于日期问题,您可以选择以下选项:

  • 删除 startend 变量中的 new Date()

  • 使用 getDisplayValue() 而不是 getValue()

参考文献:

这里的代码在 getCalendarsByName、getCalendarById、getDefaultCalendar 的 3 种方式中都能正常工作

function testCalendar() { 
  
  var sh = SpreadsheetApp.getActiveSheet()
  var start = new Date(sh.getRange('A1').getValue()).getTime()
  var end = new Date(sh.getRange('A2').getValue()).getTime()

  var calendName = CalendarApp.getCalendarsByName('alertes');
  var calendById = CalendarApp.getCalendarById('a2j9469bvfr93ob9bbottd0v80@group.calendar.google.com')
  var calend = CalendarApp.getDefaultCalendar()

  calendName[0].createEvent('test script createEvent', new Date(start), new Date(end)).addSmsReminder(0); 
  calendById.createEvent('test script createEvent', new Date(start), new Date(end)).addSmsReminder(0);   
  calend.createEvent('test script createEvent', new Date(start), new Date(end)).addSmsReminder(0);   

}

所以,我建议你试试

function calendar() {
  var spreadsheet = SpreadsheetApp.getActiveSheet();
  var eventCal = CalendarApp.getCalendarById("c_v6h2ud0dru0dqojch3103sue20@group.calendar.google.com");
  var name = spreadsheet.getRange('U69').getValue();
  var start = new Date(spreadsheet.getRange('U70').getValue()).getTime();
  var end =  new Date(spreadsheet.getRange('X69').getValue()).getTime();
  eventCal.createEvent(name,new Date(start),new Date(end));
  Logger.log('Reminder is added to your calendar');
}