2012-10-22 94 views
2

我想出瞭如何將事件添加到日曆中,但花了8個小時試圖弄清楚如何編輯現有事件(或刪除它,無論哪種方式都能完成工作)。下面是我得到了什麼:如何使用Google應用程序腳本修改Google日曆事件?

function UpdateEventTime() { 
    var cal = CalendarApp.getCalendarById("[email protected]"); 
    var sheet = SpreadsheetApp.getActiveSheet(); 
    var startRow = 1; // First row of data to process 
    var numRows = 1; // Number of rows to process 
    var dataRange = sheet.getRange(startRow, 5, numRows, 5); 
    var data = dataRange.getValues(); 


// var oldtstart = SpreadsheetApp.getActiveSheet().getRange('G2'); 
// var oldtstop = SpreadsheetApp.getActiveSheet().getRange('H2'); 
// ?????????????????????????????????????????????????? 
// ?? How do I call up and delete the old event? ?? 
// ?????????????????????????????????????????????????? 



    for (i in data) { 
    var row = data[i]; 
    var title = row[0]; // First column 
    var desc = row[1];  // Second column 
    var tstart = row[2]; 
    var tstop = row[3]; 
    var loc = row[4]; 
    cal.createEvent(title, tstart, tstop, {description:desc,location:loc}); 
    SpreadsheetApp.getActiveSheet().getRange('G2').setValue(tstart); 
    SpreadsheetApp.getActiveSheet().getRange('H2').setValue(tstop); 
} 
} 

從我可以在在線文檔中說,你不能拉了一個事件,你只能拉在一個日期範圍內的所有事件。因此,在代碼結束時,我嘗試將開始時間和停止時間存儲在電子表格中,然後在下次執行腳本時再引用它。中間的註釋部分就是我迷路的地方。這就是我想要調用上次我運行腳本時添加的事件的地方。我需要編輯它或刪除它。

請幫忙。

回答

5

如果您設法將電子表格中的事件ID與這些詳細信息一起保存,會更好。 如果您需要修改或刪除這些事件,只需通過id獲取事件並執行相關操作。

修改後的代碼 爲了節省

var event = cal.createEvent(title, tstart, tstop, {description:desc,location:loc}); 
var eventid = event.getId(); 
SpreadsheetApp.getActiveSheet().getRange('I2').setValue(eventid); 

,以獲取事件回來以後

var id = SpreadsheetApp.getActiveSheet().getRange('I2'); 
var cal = CalendarApp.getCalendarById("[email protected]"); 
var event = cal.getEventSeriesById(id); 
//Now modify or delete the event 
event.addEmailReminder(minutesBefore); 
event.addGuest(email); 
event.deleteEvent(); 
. 
. 
. 

希望這將幫助你

+0

謝謝Waqar!這似乎讓我非常喜歡正確的方向,但我得到了一個_你找不到的資源。 (第5行)_消息響應'var event = cal.getEventSeriesById(id);' – user1764447

+0

我得到了它的工作...需要添加一個.getValue THANKYOU的幫助,這是我的頭撞昨天整整一天。 – user1764447

+0

我很高興它幫助你:) –

1

編輯:我在寫我的回答而瓦卡是張貼他的答案...所以這是一種重複,但我只是張貼它,所以你得到一個例子...

您可以使用其ID訪問活動,以下是將賓客添加到日曆活動的示例。它還更新顯示結果的日誌表。

function sendinvites(e) { 
    var ss = SpreadsheetApp.openById('0AnZ5_Sh________UJnVlFtNDM2NUE') 
    var sh = ss.getSheets()[0] 
    var logsheet = ss.getSheets()[1] 
    var last = ss.getLastRow(); 
    var FUS1=new Date().toString().substr(25,8); 
    var calendar_name = 'test' 
    var group = GroupsManager.getGroup('groupemail'); 
    var members = group.getAllMembers(); 
    var startDate = new Date(e.parameter.start); 
    var endDate = new Date(e.parameter.end); 
    var Calendar = CalendarApp.getCalendarsByName(calendar_name); 
    var sheetName = calendar_name + "-du-" + Utilities.formatDate(e.parameter.start, FUS1, "dd-MMM-yyyy") 
     + "-au-" + Utilities.formatDate(e.parameter.end, FUS1, "dd-MMM-yyyy") 
// 
    var events = Calendar[0].getEvents(startDate , endDate); 
    if (events[0]) { 
    var eventarray = new Array(); 
    var line = new Array(); 
    line.push('Titre : '+calendar_name,'Début ','Fin','Localisation','Durée','invités'); 
    eventarray.push(line); 

    for (i = 0; i < events.length; i++) { 
     var ID = events[i].getId() 
    var lr = logsheet.getLastRow(); 
     logsheet.getRange(lr+1,1).setValue(events[i].getTitle()+'/'+Utilities.formatDate(events[i].getStartTime(), FUS1, "dd-MMM-yyyy")); 
     for(nn=0;nn<members.length;++nn){ 
     logsheet.getRange(lr+1,nn+2).setValue(members[nn]); 
     Calendar[0].getEventSeriesById(ID).addGuest(members[nn]) 
     } 
     line = new Array(); 
     line.push(events[i].getTitle()); 
     line.push(Utilities.formatDate(events[i].getStartTime(), FUS1, "dd-MMM-yyyy")+' à ' +Utilities.formatDate(events[i].getStartTime(), FUS1, "HH:mm")); 
     line.push(Utilities.formatDate(events[i].getEndTime(), FUS1, "dd-MMM-yyyy")+' à ' +Utilities.formatDate(events[i].getEndTime(), FUS1, "HH:mm")); 
     line.push(events[i].getLocation()); 
     line.push((events[i].getEndTime() - events[i].getStartTime())/3600000); 
     var invitelist=''; 
     var list = Calendar[0].getEventSeriesById(ID).getGuestList() 
      for(nn=0;nn<list.length;++nn){invitelist+=list[nn].getName()+', '} 
     line.push(invitelist) 
     eventarray.push(line); 
    } 
    Logger.log(eventarray) 
    var sheet = SpreadsheetApp.getActiveSpreadsheet().insertSheet(sheetName); 
    sheet.getRange(1,1,eventarray.length,eventarray[0].length).setValues(eventarray); 
    sheet.getRange(1,1,1,eventarray[0].length).setBackgroundColor('#ffffcc'); 
    sheet.setColumnWidth(1, 450);sheet.setColumnWidth(2, 150);sheet.setColumnWidth(3, 150);sheet.setColumnWidth(4, 250);sheet.setColumnWidth(5, 75);sheet.setColumnWidth(6, 450);; 
    sheet.setFrozenRows(1) 
    } else { 
    var startstring = Utilities.formatDate(e.parameter.start, FUS1, "dd-MMM-yyyy"); 
    var endstring = Utilities.formatDate(e.parameter.end, FUS1, "dd-MMM-yyyy"); 
    Browser.msgBox('Aucun événement entre le ' + startstring + ' et le ' + endstring +' dans votre agenda :'+calendar_name); 
    } 
} 
+0

謝謝你的迴應,我可以藉此從而最終擴展我的代碼。我不得不承認我只是笨手笨腳的,而不是程序員,所以我有點不知所措......但看起來有一些想法,我可以參考一下,因爲我掌握了基本知識。 – user1764447

1

如果人們在將來尋找這個,下面是我整合了Waqar的建議後的最終代碼。有用。當它創建一個新事件時,它抓取eventID並將其存儲在單元格I2的電子表格中。它通過基於eventID查找事件,刪除它並用新的替換它來「更新」現有事件。

function CreateOrReplaceEvent() { 
    var cal = CalendarApp.getCalendarById("[email protected]"); 
    var id = SpreadsheetApp.getActiveSheet().getRange('I2').getValue(); 

    if(id != 0){ 
    var event = cal.getEventSeriesById(id); 
    event.deleteEventSeries(); 
    } 

    var sheet = SpreadsheetApp.getActiveSheet(); 
    var startRow = 1; // First row of data to process 
    var numRows = 1; // Number of rows to process 
    var dataRange = sheet.getRange(startRow, 5, numRows, 5); 
    var data = dataRange.getValues(); 

    for (i in data) { 
    var row = data[i]; 
    var title = row[0]; // First column 
    var desc = row[1];  // Second column 
    var tstart = row[2]; 
    var tstop = row[3]; 
    var loc = row[4]; 
    var event = cal.createEvent(title, tstart, tstop, {description:desc,location:loc}); 
    var eventid = event.getId(); 
    SpreadsheetApp.getActiveSheet().getRange('I2').setValue(eventid); 
    } 
} 
3

這裏是一個正在進行的工作,我把它放在一起。它仍然需要被罰款,但我想我會張貼它以防萬一有人在優化代碼的洞察力,併爲任何人會發現它有用。基本上,代碼從日曆和電子表格中創建一個數組,並將它們組合在一起。對上次修改的日期進行排序(日期上次更新爲事件日期,標準腳本上次修改日期爲電子表格),刪除重複項,並提交給日曆(當前在刪除所有事件後)和電子表格。我打算添加一個密鑰,並且有一個列表,您可以在其中鍵入要從兩個位置刪除項目的密鑰,有利的是您可以從日曆中添加電子表格行,反之亦然。預先感謝任何有用的意見。

function onOpen() { 
var ss = SpreadsheetApp.getActiveSpreadsheet(); 
var menuEntries = [ {name: "Sync Spreadsheet to Calendar", functionName: "calsync"}]; 
//{name: 「Sync」, functionName: 「myimport」}]; 
ss.addMenu(「Calendar Sync」, menuEntries); 
} 

function calsync() 
{ 
// This function should be executed from the 
// spreadsheet you want to export to the calendar 
var mySpreadsheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(「Test123″); 

var myCalendar = CalendarApp.openByName(「Test」); 

//calendar event array 
var events = myCalendar.getEvents(new Date(「January 1, 2011 EST」), 
new Date(「January 1, 2014 EST」)); 
if (events[0]) { 
var eventarray = new Array(); 
var line = new Array(); 
line.push(‘Title’); 
line.push(‘Start Date’); 
line.push(‘End Date’); 
line.push(‘Description’); 
line.push(‘Last Modified’); 
eventarray.push(line); 

var i = 0; 
for (i = 0; i < events.length; i++) { 
line = new Array(); 
line.push(events[i].getTitle()); 
line.push(events[i].getStartTime()); 
line.push(events[i].getEndTime()); 
line.push(events[i].getDescription()); 
line.push(events[i].getLastUpdated()); 
//line.push(events[i].getLocation()); 
eventarray.push(line); 
} 
} else { 
Browser.msgBox('nothing between ' + startDate + ' till ' + endDate); 
} 

var dataRange = mySpreadsheet.getRange("A2:E53"); 
var data = dataRange.getValues(); 

if (data[0]) { 
var dataarray = new Array(); 
var line2 = new Array(); 

var j = 0; 
for (j = 0; j < data.length; j++) { 
var row = data[j]; 
line2 = new Array(); 
line2.push(row[0]); 
line2.push(row[1]); 
line2.push(row[2]); 
line2.push(row[3]); 
line2.push(row[4]); 
//line.push(events[i].getLocation()); 
//line.push((events[i].getEndTime() – events[i].getStartTime())/3600000); 
dataarray.push(line2); 
} 
} else { 
Browser.msgBox('nothing between ' + startDate + ' till ' + endDate); 
} 

var newarray = eventarray.concat(dataarray); 
uniquedata(newarray); 

} 

//found at https://developers.google.com/apps-script/articles/removing_duplicates 
function uniquedata(data) { 
var newData = new Array(); 
var data2 = sort(data, 4, false); 
for(i in data2){ 
var row = data2[i]; 
var duplicate = false; 
for(j in newData){ 
if(row[0] == newData[j][0]){ 
duplicate = true; 
} 
} 
if(!duplicate){ 
newData.push(row); 
} 
} 
var filtered = sort(newData, 4 , false); 
UpdateSpreadsheet(filtered); 
UpdateCalendar(filtered); 
// var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Test123"); 
// sheet.clearContents(); 
// sheet.getRange(1, 1, filtered.length, filtered[0].length).setValues(filtered); 
} 

function UpdateSpreadsheet(data) { 
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Test123"); 
sheet.clearContents(); 
sheet.getRange(1, 1, data.length, data[0].length).setValues(data); 
} 

function UpdateCalendar(data) 
{ 
var myCalendar = CalendarApp.openByName("Test"); 

// optional – delete existing events 
var events = myCalendar.getEvents(new Date("January 1, 2011 EST"), 
new Date("January 1, 2013 EST")); 
for (var i = 0; i 0) { 
if (typeof columnIndex != 「number」 || columnIndex > data[0].length) { 
throw ‘Choose a valide column index’; 
} 
var r = new Array(); 
var areDates = true; 
for (var i = 0; i < data.length; i++) { 
var date = new Date(data[i][columnIndex]); 
if (isNaN(date.getYear()) && data[i][columnIndex] != '') areDates = false; 
else if (data[i][columnIndex] != '') data[i][columnIndex] = date; 
r.push(data[i]); 
} 
return r.sort(function (a, b) { 
if (ascOrDesc) return ((a[columnIndex] b[columnIndex]) ? 1 : 0)); 
return ((a[columnIndex] > b[columnIndex]) ? -1 : ((a[columnIndex] < b[columnIndex]) ? 1 : 0)); 
}); 
} 
else { 
return data; 
} 
} 
+0

發佈的腳本似乎有問題。在「valide」這個詞上面的兩行,我們有:for(var i = 0; i 0){這是正確的嗎?它看起來不正確。 – MurrayW

相關問題