通过电子表格在多个 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()
时选择事件进入哪个日历。有几种方法可以做到这一点,而且您不需要任何额外的循环!您可以使用对象并按名称引用它们。
我首先要做的是,在您当前定义 cal
和 calId
的位置,创建一个对象来定义三个日历,如下所示:
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
}
我正在尝试创建一个 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()
时选择事件进入哪个日历。有几种方法可以做到这一点,而且您不需要任何额外的循环!您可以使用对象并按名称引用它们。
我首先要做的是,在您当前定义 cal
和 calId
的位置,创建一个对象来定义三个日历,如下所示:
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
}