【发布时间】:2014-09-11 11:04:34
【问题描述】:
我找到了这个绝对精彩的答案,它帮助我拼凑了一个脚本。请耐心等待,我在 Google Apps 脚本方面的教育程度不是最高的,但我已经做到了!
Create Google Calendar Events from Spreadsheet but prevent duplicates
这是专门展示如何防止重复的,但不幸的是,这是我的具体问题。我发现这是由于我的脚本没有在电子表格上创建 eventid,我的脚本应该能够识别并因此避免重复。
谁能帮我解决我哪里出错了?
我的电子表格上的标题是这样排列的,粗体部分实际上适用于脚本:
0 存款日期 | 1 位客户 | 2 日期决赛 | 3 出站 |4 入站| 5 AST - TY |6 AST - BV|7 座|8 餐|9 FF |10 床上用品|11 特价|12 WHC|13 文件|14 空白|15 开始时间 |16 结束时间|17 EventID WHC|18 WHC 标题 |19 文档标题 |20 EventID 文档
/**
* 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 WHCs",
functionName : "exportWHCs"
},
{
name : "Export Docs",
functionName : "exportDocs"
}];
sheet.addMenu("Calendar Actions", entries);
};
/**
* Export events from spreadsheet to calendar
*/
function exportWHCs() {
var sheet = SpreadsheetApp.getActiveSheet();
var headerRows = 4; // Number of rows of header info (to skip)
var range = sheet.getDataRange();
var data = range.getValues();
var calId = "pma5g2rd5cft4lird345j7pke8@group.calendar.google.com";
var cal = CalendarApp.getCalendarById(calId);
for (i in data) {
if (i < headerRows) continue; // Skip header row(s)
var row = data[i];
var date = new Date(row[12]); // First column
var title = row[18]; // Second column
var tstart = new Date(row[15]);
tstart.setDate(date.getDate());
tstart.setMonth(date.getMonth());
tstart.setYear(date.getYear());
var tstop = new Date(row[16]);
tstop.setDate(date.getDate());
tstop.setMonth(date.getMonth());
tstop.setYear(date.getYear());
var id = row[17]; // 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"));
var newEvent = cal.createEvent(title, tstart, tstop).addEmailReminder(5).getId();
row[17] = newEvent; // Update the data array with event ID
}
else {
event.setTitle(title);
// 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);
}
function exportDocs() {
var sheet = SpreadsheetApp.getActiveSheet();
var headerRows = 4; // Number of rows of header info (to skip)
var range = sheet.getDataRange();
var data = range.getValues();
var calId = "pma5g2rd5cft4lird345j7pke8@group.calendar.google.com";
var cal = CalendarApp.getCalendarById(calId);
for (i in data) {
if (i < headerRows) continue; // Skip header row(s)
var row = data[i];
var date = new Date(row[13]); // First column
var title = row[19]; // Second column
var tstart = new Date(row[15]);
tstart.setDate(date.getDate());
tstart.setMonth(date.getMonth());
tstart.setYear(date.getYear());
var tstop = new Date(row[16]);
tstop.setDate(date.getDate());
tstop.setMonth(date.getMonth());
tstop.setYear(date.getYear());
var id = row[20]; // 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"));
var newEvent = cal.createEvent(title, tstart, tstop).addEmailReminder(5).getId();
row[20] = newEvent; // Update the data array with event ID
}
else {
event.setTitle(title);
// 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);
}
编辑:这是我在看到来自 Serge 的 cmets 之后所尝试的,与上面相同的列,但它仍然不会填充 eventID 列,例如 17 :(
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 = 4; // Number of rows of header info (to skip)
var range = sheet.getDataRange();
var data = range.getValues();
var calId = "pma5g2rd5cft4lird345j7pke8@group.calendar.google.com";// use default claendar for tests
var cal = CalendarApp.getCalendarById(calId);
for (i in data) {
if (i < headerRows) continue; // Skip header row(s)
var row = data[i];
var date = new Date(row[12]); // First column
var title = row[18]; // Second column
var tstart = setTimeToDate(date,row[15]);
var tstop = setTimeToDate(date,row[16]);
Logger.log('date = '+date+'tstart = '+tstart+' tstop = '+tstop);
var type = row[21];
var times = row[22]
var id = row[17];
// Check if event already exists, update it if it does
try {
var event = cal.getEventSeriesById(id);
event.setTitle('got you');// this is to "force error" if the event does not exist, il will never show for real ;-)
}catch(e){
var newEvent = cal.createEvent(title, tstart, tstop); // create a "normal" event
row[17] = newEvent.getId(); // Update the data array with event ID
Logger.log('event created');// while debugging
var event = cal.getEventSeriesById(row[17]);// make it an event Serie
}
event.setTitle(title);
if(type=='PM'){
var recurrence = CalendarApp.newRecurrence().addMonthlyRule().times(times)
event.setRecurrence(recurrence, tstart, tstop);// we need to keep start and stop otherwise it becomes an AllDayEvent if only start is used
}else if(type=='PW'){
var recurrence = CalendarApp.newRecurrence().addWeeklyRule().times(times)
event.setRecurrence(recurrence, tstart, tstop);
}
debugger;
data[i]=row;// update data array (row contains ID from row[17]=newEvent)
}
// Record all event IDs to spreadsheet
range.setValues(data);
}
function setTimeToDate(date,time){
var t = new Date(time);
var hour = t.getHours();
var min = t.getMinutes();
var sec = t.getSeconds();
var dateMod = new Date(date.setHours(hour,min,sec,0))
return dateMod;
}
【问题讨论】:
-
请阅读this post,您也犯了同样的错误(例如关于日期/时间),所以我不再解释。
-
非常感谢您回复 Serge!我确实看到了您的帖子,但是在直接复制它并仅更改列号之后,我仍然遇到了同样的问题,即。它没有填充 eventID 列。我确定这是我做错的事情,我终生无法弄清楚我在做什么!我已经编辑了上面的问题,向您展示了我尝试过的副本,结合了您其他帖子中的代码以及您在下面弹出的附加信息。
-
这里是the link to a testSheet 我按照您的设置制作的。它按预期工作,并将 ID 写入右列。试一试,如果出现问题,请随时发表评论。 (表为只读,使用前请复制并更新日历ID)
-
你是我的英雄 Serge - 你刚刚帮我解决了这个问题!那个测试表对我来说也很完美,我意识到因为我已经在我的系统上设置了电子表格来预填充文本行(最多 1000 行),脚本本身没有完成(超时错误),这意味着它甚至没有达到创建 eventID 的地步。至少我认为是这个原因!这是链接link - 你认为我可能是对的吗?再次感谢你,Serge...我非常感谢你的帮助。
-
哇!我第一次成为某人的英雄 ;-) 一个男孩生命中的伟大时刻!谢谢 超时错误有多种解决方案,您能否在这个特定方面启动一个新线程?
标签: google-apps-script duplicates google-sheets google-calendar-api