首页 > 解决方案 > 试图让谷歌表格中的标题和日期自动与谷歌日历同步

问题描述

我设法得到一些工作,它将获取标题和日期并将其放入 Google 日历中,但我必须每次都运行脚本。但是,当我更改事件的日期(日期总是在变化)时,它只会制作另一个事件并保留旧事件。

我只想有一个带有标题和日期的谷歌表,以便将事情发生同步到谷歌日历,当日期发生变化时,它会修改一个事件而不创建新事件。理想情况下,也不必每次都运行脚本。

function myFunction() {
  var spreadsheet = SpreadsheetApp.getActiveSheet();
  var calendarId = "test calendar";
  var eventCal = CalendarApp.getCalendarById(calendarId);
  var schedule = spreadsheet.getRange("A4:B6").getValues();

  for (x=0; x<schedule.length; x++) {
    var shifts = schedule[x];
    var Eventnames = shifts[0];
    var DateofEvent = shifts[1];

    eventCal.createAllDayEvent(Eventnames, DateofEvent);
  }
}

标签: javascriptgoogle-apps-scriptgoogle-sheetsgoogle-calendar-api

解决方案


以下是完成此操作的步骤

  1. 为 Calendar_Event_ID 创建一列(本例中为 C 列)
  2. 运行此代码为您的所有事件创建日历事件(与您的代码相同,修改后将日历事件 ID 保存在 Calendar_Event_ID 列中)。您最终将得到如下数据结构:
一个 C
事件名称1 事件日期1 事件 ID1
事件名称2 事件日期2 事件 ID2
function myFunction() {
  var calendarEventIdColumn = 3 // put the number of your column choice here (C = 3)
  var dataStartRow = 4 // you started at A4 in your example, so I am starting with row 4
  var calendarEventIds = []; // this will store a list of calendar event IDs
  var spreadsheet = SpreadsheetApp.getActiveSheet();
  var calendarId = "test calendar";
  var eventCal = CalendarApp.getCalendarById(calendarId);
  var schedule = spreadsheet.getRange("A4:C6").getValues(); // added column C to include the calendar event ids

  for (var x=0; x < schedule.length; x++) {
    var shifts = schedule[x];
    var Eventnames = shifts[0];
    var DateofEvent = shifts[1];
    var eventId = shifts[2];
    var event;
    // if the event already exists, edit it. Otherwise create a new one.
    if (eventId !== '') {
      event = eventCal.getEventById(eventId);
      event.setTitle(Eventnames);
      event.setAllDayDate(DateofEvent);
    } else {
      event = eventCal.createAllDayEvent(Eventnames, DateofEvent);  
    }
    calendarEventIds.push([event.getId()]); // add the event id to list of event ids 
  }
  // save the new calendar event IDs under the calendarEventIdColumn
  spreadsheet.getRange(dataStartRow, calendarEventIdColumn, calendarEventIds.length, 1).setValues(calendarEventIds);
}
  1. myFunction每次编辑事件的日期或名称时重新运行。请注意,您可以通过在应用程序脚本代码编辑器中运行该函数、创建自定义菜单项或使用编辑触发器来“手动”执行此操作。

推荐阅读