通过电子表格在多个 Google 个日历中创建活动

Create events in multiple Google Calendars from Spreadsheet

我正在尝试创建一个 sheet,它可以将来自单个 google sheet 的事件创建到多个 google 日历中。我正在使用从 Mogsdad 的 post Create Google Calendar Events from Spreadsheet but prevent duplicates 上的出色解决方案修改而来的 sheet。然而,我一直在将我的工作重复三次以进入 3 个不同的日历,并希望我的第一次编程。我的想法是我想更进一步并添加一个下拉列(标记为状态),其中包含(未确认、保存日期、已确认),然后在一个或所有三个日历中创建一个与条件相同的日历下拉。

我的sheet排列为:-

Date | Title | Start Time | End Time | Location | Description | Even ID | Status | Confirmed details | Confirmed Start time | confirmed end time |

如您所见,我的想法是在已确认的日历中包含与其他两个略有不同的信息。

我使用的现有代码是

/**
 * Adds a custom menu to the active spreadsheet, containing a single menu item
 * for invoking the exportEvents() function.
 * The onOpen() function, when defined, is automatically invoked whenever the
 * spreadsheet is opened.
 * For more information on using the Spreadsheet API, see
 * https://developers.google.com/apps-script/service_spreadsheet
 */
function onOpen() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var entries = [{
    name : "Export Events",
    functionName : "exportEvents"
  }];
  sheet.addMenu("Calendar Actions", entries);
};

/**
 * Export events from spreadsheet to calendar
 */
function exportEvents() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var headerRows = 1;  // Number of rows of header info (to skip)
  var range = sheet.getDataRange();
  var data = range.getValues();
  var calId = "30kpfnt5jlnooo688qte6ladnk@group.calendar.google.com";
  var cal = CalendarApp.getCalendarById(calId);
  for (i=0; i<data.length; i++) {
    if (i < headerRows) continue; // Skip header row(s)
    var row = data[i];
    var date = new Date(row[0]);  // First column
    var title = row[1];           // Second column
    var tstart = new Date(row[2]);
    tstart.setDate(date.getDate());
    tstart.setMonth(date.getMonth());
    tstart.setYear(date.getYear());
    var tstop = new Date(row[3]);
    tstop.setDate(date.getDate());
    tstop.setMonth(date.getMonth());
    tstop.setYear(date.getYear());
    var loc = row[4];
    var desc = row[5];
    var id = row[6];              // Sixth column == eventId
// Check if event already exists, delete it if it does
try {
  var event = cal.getEventSeriesById(id);
  event.deleteEventSeries();
  row[6] = '';  // Remove event ID    
}
catch (e) {
  // do nothing - we just want to avoid the exception when event doesn't exist
}
//cal.createEvent(title, new Date("March 3, 2010 08:00:00"), new Date("March 3, 2010 09:00:00"), {description:desc,location:loc});
var newEvent = cal.createEvent(title, tstart, tstop, {description:desc,location:loc}).getId();
row[6] = newEvent;  // Update the data array with event ID
debugger;
  }
  // Record all event IDs to spreadsheet
  range.setValues(data);
}

所以我意识到我需要定义新信息以进入 "confirmed" 日历以及 2 个附加日历。我的问题是我不知道如何适应一系列 if 循环以将事件定向到 3 个日历。我还希望日历可以添加,例如所有出现在 "unconfirmed calendar" 中的事件都会被添加以保存升级到该状态时的日期,然后在设置为该状态时最终出现在 "confirmed" 中。所以一个确认的事件出现在所有 3 个日历中,但一个未确认的事件只出现在那里。

我对编程几乎是全新的,所以请保持友善并原谅我公然剽窃他人的作品(感谢 Mogsdad),我很感激任何帮助!

欢迎编程!一旦掌握了它,您就会想要为您使用的每个 Google 产品编写脚本。 :)

如果我对您的问题的理解正确,您希望能够在 运行 函数 exportEvents() 时选择事件进入哪个日历。有几种方法可以做到这一点,而且您不需要任何额外的循环!您可以使用对象并按名称引用它们。

我首先要做的是,在您当前定义 calcalId 的位置,创建一个对象来定义三个日历,如下所示:

var cal1 = "30kpfnt5jlnooo688qte6ladnk@group.calendar.google.com";
var cal2 = "string url for second calendar";
var cal3 = "string url for third calendar";
var calendars = {
   Unconfirmed: CalendarApp.getCalendarById(cal1),
   SaveTheDate: CalendarApp.getCalendarById(cal2),
   Confirmed: CalendarApp.getCalendarById(cal3)
}

对象 calendars 现在包含三个日历的日历对象,因此 key 是状态,value 是对象。然后,当您获取每一行的数据时,添加

var cal = row[7];

现在,cal 包含指示状态的字符串。您可以通过更改 newEvent 定义来充分利用链接:

var newEvent = calendars[cal].createEvent(title, tstart, tstop, {description:desc,location:loc}).getId();

这里发生的事情是 calendars[cal] 获取与 table 中的字符串对应的日历对象,然后您可以向其中添加新事件。这确实需要更改您的 sheet - 将状态栏中的标签从 'Save the Date' 更改为 'SaveTheDate' 以使其与变量名称匹配。应该这样做!

编辑

要将事件添加到多个日历,我会使用 if 语句,但您不需要循环。像下面这样的东西会起作用:

calendars['Unconfirmed'].createEvent(title...  // Add to unconfirmed no matter what
if (cal != 'Unconfirmed'){
  calendars['SaveTheDate'].createEvent(title... // Add to SaveTheDate only if not Unconfirmed
}
if (cal == 'Confirmed'){
  calendars['Confirmed'].createEvent(title...  // Only add to Confirmed if Confirmed
}