Google apps script 如何从电子表格中创建Google日历全天事件,该电子表格可以更新,而无需创建重复项
我一直在使用GoogleApps脚本及其代码来创建可从电子表格日历事件进行更新,而不创建重复项Google apps script 如何从电子表格中创建Google日历全天事件,该电子表格可以更新,而无需创建重复项,google-apps-script,google-sheets,google-calendar-api,Google Apps Script,Google Sheets,Google Calendar Api,我一直在使用GoogleApps脚本及其代码来创建可从电子表格日历事件进行更新,而不创建重复项 /** * 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
/**
* 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 = "YOUR_CALENDAR_ID";
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, update it if it does
try {
var event = cal.getEventSeriesById(id);
}
catch (e) {
// do nothing - we just want to avoid the exception when event doesn't exist
}
if (!event) {
//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
}
else {
event.setTitle(title);
event.setDescription(desc);
event.setLocation(loc);
// event.setTime(tstart, tstop); // cannot setTime on eventSeries.
// ... but we CAN set recurrence!
var recurrence = CalendarApp.newRecurrence().addDailyRule().times(1);
event.setRecurrence(recurrence, tstart, tstop);
}
debugger;
}
// Record all event IDs to spreadsheet
range.setValues(data);
}
我不知道如何把两者结合起来。任何帮助都将不胜感激,当涉及到编码时,我是一个noob
编辑:修订代码
**
* 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 space = " - "
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 = "en0d0u4gismehh6qmkstskfavk@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 numb = row[3];
var title = numb.substring(11,6) +space+ row[1];
var loc = row[2];
var id = row[4]; // Sixth column == eventId
// Check if event already exists, update it if it does
try {
var event = cal.getEventSeriesById(id);
}
catch (e) {
// do nothing - we just want to avoid the exception when event doesn't exist
}
if (!event) {
//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.createAllDayEvent(title, date, {location:loc}).getId();
row[4] = newEvent; // Update the data array with event ID
}
else {
event.setTitle(title);
event.setLocation(loc);
// event.setTime(tstart, tstop); // cannot setTime on eventSeries.
// ... but we CAN set recurrence!
var recurrence = CalendarApp.newRecurrence().addDailyRule().times(1);
event.setRecurrence(recurrence, date);
}
debugger;
}
// Record all event IDs to spreadsheet
range.setValues(data);
}
我认为类似于此的东西应该可以做到:
function createAllDayEvents() {
var ss=SpreadsheetApp.getActive();
var sh=ss.getActiveSheet();
var rg=sh.getRange(2,1,sh.getLastRow()-1,sh.getLastColumn());
var vA=rg.getValues();
var cal=CalendarApp.getCalendarById("cal id");
vA.forEach(function(r,i){
if(r[0]) {
var date=new Date(r[0]);
var title=r[1];
var loc=r[2];
var desc=r[3];
var id=r[4];
//if there is an id already there that means the event has already been created
if(!id) {
var event=cal.createAllDayEvent(title, date, {description:desc,location:loc});
sh.getRange(i+2,5).setValue(event.getId());
}
}
});
}
这就是我的电子表格的样子:
这将删除以下事件:
function deleteAllDayEvents() {
var ss=SpreadsheetApp.getActive();
var sh=ss.getActiveSheet();
var rg=sh.getRange(2,1,sh.getLastRow()-1,sh.getLastColumn());
var vA=rg.getValues();
var cal=CalendarApp.getCalendarById("q289qp9augtnshkn70dkibcc54@group.calendar.google.com");
vA.forEach(function(r,i){
var id=r[4];
if(id && r[5]) {
cal.getEventById(id).deleteEvent();
sh.getRange(i+2,5).setValue("");
sh.getRange(i+2,6).setValue("FALSE");//just to reset the checkbox
}
})
}
稍微修改一下电子表格:
我刚刚在电子表格中添加了一列复选框
这对我来说似乎很有效
太棒了,谢谢!你知道如果一行是空的,我会怎么告诉它跳过它吗?它现在应该跳过空行。是的,但我似乎无法让更新表->cal事件与你的代码一起工作。我能够在代码中使用var event=cal.createAllDayEvent使全天事件正常工作。因此,如果有一个if语句或过滤器,我可以添加到现有的代码中,这将是非常棒的。我将用我修改过的代码编辑问题你在哪一行?我没有看到类似更新表->cal事件//检查事件是否已经存在,如果它尝试{var event=cal.geteventseriesbyidd;}catch e{//什么都不做-我们只是想避免事件不存在时的异常}if!事件{//cal.createEventtitle,新日期2010年3月3日08:00:00,新日期2010年3月3日09:00:00,{description:desc,location:loc};var newEvent=cal.createAllDayEventtitle,date,{location:loc}.getId;row[4]=newEvent;//使用事件ID更新数据数组您是否共享工作结果的副本?
function deleteAllDayEvents() {
var ss=SpreadsheetApp.getActive();
var sh=ss.getActiveSheet();
var rg=sh.getRange(2,1,sh.getLastRow()-1,sh.getLastColumn());
var vA=rg.getValues();
var cal=CalendarApp.getCalendarById("q289qp9augtnshkn70dkibcc54@group.calendar.google.com");
vA.forEach(function(r,i){
var id=r[4];
if(id && r[5]) {
cal.getEventById(id).deleteEvent();
sh.getRange(i+2,5).setValue("");
sh.getRange(i+2,6).setValue("FALSE");//just to reset the checkbox
}
})
}