0

我發現這絕對美妙的答案,它幫助我拼湊了一個腳本。忍受我,我不是在Google Apps腳本中最受教育的人,但我到了那裏!從Google電子表格創建Google日曆活動 - 腳本正在創建複製品

Create Google Calendar Events from Spreadsheet but prevent duplicates

這是專門展示如何防止重複,但是這是不幸的是我具體的問題。我已經發現,這是由於我的腳本沒有在電子表格中創建緩衝區,我的腳本應該識別並因此避免重複。

任何人都可以幫助我解決問題嗎?

這是怎麼對我的電子表格中的頭一字排開,粗體的人實際上也適用於腳本:

0敷日期| 1客戶| 2 日期決賽 | 3出站| 4 入站 | 5 AST - TY | 6 AST - BV | 7座位| 8膳食| 9 FF | 10牀上用品| 11特價| 12 WHC | 13 Docs | 14空白| 15 開始時間 | 16 結束時間 | 17 EventID WHC | 18 WHC標題 | 19 文檔標題 | 20個事件ID文檔

/** 
* 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 = "[email protected]"; 
    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 = "[email protected]"; 
    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); 
} 

編輯:這是我嘗試過,看到上面從塞爾的意見,同列之後,卻仍然贏得填充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 = "[email protected]";// 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; 
} 
+0

請閱讀[此帖](http://stackoverflow.com/questions/25515765/create-google-calendar-recurring-events-from-spreadsheet),你是做出同樣的錯誤(例如關於日期/時間),所以我不會再解釋。 – 2014-09-11 11:54:27

+0

非常感謝Serge的迴應!我的確看到了你的帖子,但直接複製它並改變列號後,我仍然有同樣的問題,即。它不會填充eventID列。我確信這是我做錯事的原因,我只是不能爲我的生活制定出我正在做的事情!我已經編輯了上述問題,向您展示我嘗試的重複內容,結合了您其他帖子的代碼以及下面彈出的其他信息。 – Ingrid 2014-09-12 06:12:49

+1

這裏爲[鏈接到testSheet(https://docs.google.com/spreadsheets/d/1EOLfICNewy4UB4OaFW5QR24lBPRW2SqX_svMaXRXWRc/edit?usp=sharing)我做了以下您的設置。它按預期工作,並將ID寫入右列。試一試,隨意評論是有問題的。 (表格只讀,複製使用並在使用前更新日曆ID) – 2014-09-12 07:55:10

回答

1

以下是適用於您的色譜柱設置的腳本。我刪除了你沒有使用的部分。

可用的測試片here

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 = 2; // Number of rows of header info (to skip) 
    var range = sheet.getDataRange(); 
    var data = range.getValues(); 
    var calId = "[email protected]";// 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]); // WHC 
    var title = row[18];   // WHC Title 
    var tstart = setTimeToDate(date,row[15]);// start time 
    var tstop = setTimeToDate(date,row[16]);// end time 
    Logger.log('date = '+date+'tstart = '+tstart+' tstop = '+tstop); 
    var id = row[17]; //EventID WHC 
    // 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); 
    } 
    // 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; 
} 
相關問題