2013-07-08 61 views
0

我們正在從一個谷歌應用程序域遷移到另一個。爲了讓我的用戶生活更輕鬆,我想設置一個腳本,他們可以運行它將複製他們的日曆。我有複製事件的代碼,而且工作正常,但我需要執行用戶獲得的「複製到我的日曆」選項的代碼,因爲我們將關閉舊的谷歌應用程序域,並且我擔心它們將會全部丟失這些事件在外部(刪除)日曆上。Google Apps腳本複製到我的日曆

因此,在谷歌Apps腳本 - 你如何複製日曆事件,是一個實際事件在一個新的領域,而不是從舊域中的複製事件?

很難解釋!

喬治

+0

你可以發佈自己編寫的代碼 - 它有助於事宜。 有時候,代碼說得比文字更大 – Srik

+0

看看這個:https://sites.google.com/site/scriptsexamples/new-connectors-to-google-services/calendar –

回答

0

這樣做將是一個可行的方法 -

寫下您的應用程序腳本的舊域,即集裝箱綁定(可能是谷歌文檔),並部署到作爲觸發運行,那大桶在一定的頻率上(最少1分鐘)。將此Google文檔複製到舊版域中的所有用戶,並讓他們授權並調用腳本。這個腳本會讀取一定數量的事件,所以它不會如所述運行到使用限制,然後在Apps腳本中使用Calendar APIs來創建新域中的事件[我還沒有嘗試過這個,但是,我認爲它應該是可能的因爲它基於REST並支持OAuth]。 Here是與Twitter的API集成的例子和另一個Salesforce APIs

+0

我認爲同樣的問題會適用 - 事件將歸舊域 - 我需要刪除,以允許電子郵件的域別名。 – CPGS

+0

在這種情況下,您可以編寫一個腳本作爲Web App部署,並以新域中的任何一個用戶身份運行,我相信日曆應用程序允許您指定組織者(關於所有者,我不確定它是否允許)。您可以將事件數據作爲URL參數傳遞或使用HTTP POST將數據從舊域中的腳本發送到已部署的Web應用程序 – prasun

0

有什麼你可以通過谷歌Apps腳本Calendar Services完成侷限性:

  • 所有權&訪問:任何腳本需要的權限來訪問日曆在你的舊域和你的新域中。通常,個人用戶可以通過在舊日曆上設置共享來解決這個問題,因此他們的新UserId具有「查看」權限。如果他們的新域帳戶用於創建他們的日曆條目是最好的,那麼他們顯然是他們的擁有者。
  • 受邀者列表可以被複制,但對原始邀請的回覆不會被連接。鑑於許多被邀請者也在移動中更改了其電子郵件地址,因此複製被邀請者可能無濟於事。
  • 某些日曆事件屬性無法通過Calendar Services訪問,並且可能會丟失。
  • 復發是一團糟。目前,重複發生的事件變爲CalendarEventSeries,即don't support some methods事件。沒有辦法「獲取」重複信息 - 因此,要準備好將重複發生的事件變成(多個)個人事件。
  • 似乎有一個全天事件的錯誤 - API 似乎工作,但是當你檢查結果事件時,你會發現「全天」標誌沒有被檢查。

下面是做複製日曆事件的工作的功能。這是電子表格菜單/用戶界面和錯誤檢查gist that includes additional code的摘錄。有關安裝和使用腳本的更多信息,請參閱要點。

/** 
* Copy all events in given date range. Returns number of unique events 
* that were copied. 
*/ 
function copyEvents(fromCal, toCal, startDate, endDate) { 
    var copiedEvents = []; 

    var date = new Date(startDate); 
    var endD = new Date(endDate); 
    Logger.log("startDate="+startDate+", date="+date+", endDate="+endDate); 
    while (date <= endD) { 
    Logger.log(date); 
    var events = fromCal.getEventsForDay(date); 
    for (var event=0; event < events.length; event++) { 
     var src = events[event]; 
     var srcId = src.getId(); 
     if (copiedEvents.indexOf(srcId) >= 0) continue; // Multi-day events only need to be copied once 
     copiedEvents.push(srcId); 
     var newEvent; 
     if (src.isAllDayEvent()) { 
     newEvent = toCal.createAllDayEvent(src.getTitle(), src.getAllDayStartDate()) 
         .setTime(src.getAllDayStartDate(), src.getAllDayEndDate()); 
     } 
     else { 
     newEvent = toCal.createEvent(src.getTitle(), src.getStartTime(), src.getEndTime()); 
     } 
     // Set additional attributes, common for all day & single events 
     var desc = src.getDescription(); 
     if (!src.isOwnedByMe()) { // Prepend Email address of creator to description, if not "me" 
     var creators = src.getCreators(); 
     if (creators.length > 0) 
      desc = creators[0].concat(desc); 
     } 
     try { 
     newEvent.setDescription(desc); 
     } catch (e) { 
     // Work around http://code.google.com/a/google.com/p/apps-api-issues/issues/detail?id=3425 
     }; 
     newEvent.setLocation(src.getLocation()); 
     // Email Reminders 
     var reminders = src.getEmailReminders(); 
     for (var rem=0; rem < reminders.length; rem++) { 
     src.addEmailReminder(reminders[rem]); 
     } 
     // Popup Reminders 
     reminders = src.getPopupReminders(); 
     for (var rem=0; rem < reminders.length; rem++) { 
     src.addPopupReminder(reminders[rem]); 
     } 
     // SMS Reminders 
     reminders = src.getSmsReminders(); 
     for (var rem=0; rem < reminders.length; rem++) { 
     src.addSmsReminder(reminders[rem]); 
     } 
    } 
    date.setDate(date.getDate() + 1); 
    } 

    return copiedEvents.length; 
} 
+0

我在google日曆中發現的全天事件中發現的一個問題是,它們持續從00:00 day_1到00 :00 day_2。當你試圖解析它們時,它們實際上是在兩天內發生的。一整天的事件應該是從00:00到23:59:59,但谷歌已經實施了錯誤的。 – CPGS

0

您可能會遇到的主要問題可能是由於日曆服務的相對緩慢。

即使Mogsdad代碼寫得很好,並且可能儘可能高效,但由於5'時間限制,無法在一批中複製大量事件。

我一直在處理日曆很長一段時間,並且一直是一個真正的問題...

所以我的想法是處理過程中2次,「備份」寫入所有事件轉換爲電子表格進行存儲,這非常簡單直接......並且具有「恢復」功能,可讀取電子表格並在日曆中複製事件。

好的訣竅是,您可以將這些日曆數據複製到另一個日曆,這就是您的用例變得有趣的地方!只要您有寫權限,就可以確實恢復任何其他域日曆中的所有事件。

此腳本已用於非常大的數據集(一年內超過3000個事件)並且工作得很好。我用它來複制日曆,所以我有'測試副本',在那裏我可以進行各種其他實驗,而不必觸摸'真實'。

該腳本非常長,沒有很好的文檔記錄(我沒有寫這篇文章;-),但隨時試試把它添加到電子表格中。用戶界面使用法語(對於這個論壇來說是另一個不好的主意,對此感到抱歉),但任何翻譯人員都會幫助您根據需要自定義它(如果您決定使用它)。無論如何,它使用非常簡單的話,我相信任何人都會毫不費力地理解它。

這就是: (請注意,您可以選擇在備份過程中多個日曆)

var FUS1=new Date().toString().substr(25,6)+":00"; 
var tz = SpreadsheetApp.getActiveSpreadsheet().getSpreadsheetTimeZone(); 



function onOpen() { 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var menuEntries = [ 
         {name: "Backup des agendas", functionName: "backup"}, 
         {name: "Restauration d'un agenda", functionName: "restore"}, 
         ]; 
    ss.addMenu("Fonction Tech.", menuEntries); 
} 


    function backup() { 
     var doc = SpreadsheetApp.getActiveSpreadsheet(); 
     var app = UiApp.createApplication().setTitle("Sauvegarde des agendas en feuilles Google"); 
     app.setHeight(325).setWidth(420); 
     // Create a grid with 3 text boxes and corresponding labels 
     var grid = app.createGrid(4, 2); 
     var wait = app.createImage('https://dl.dropboxusercontent.com/u/211279/loading3.gif').setVisible(false); 
     grid.setWidget(0, 0, app.createLabel("Nom des agendas à sauvegarder :")); 
     var list = app.createListBox(true).setVisibleItemCount(5); 
     list.setName('calendar'); 
     grid.setWidget(0, 1, list); 
     var calendars = CalendarApp.getAllCalendars(); 
     for (var i = 0; i < calendars .length; i++) { 
     list.a 
     list.addItem(calendars[i].getName()); 
     } 
     grid.setWidget(1, 0, app.createLabel('Date début :')) 
      .setWidget(2, 0, app.createDateBox().setId("start").setValue(new Date('2013/09/01'))) 
      .setWidget(1, 1, app.createLabel('Date fin :')) 
      .setWidget(2, 1, app.createDateBox().setId("end").setValue(new Date('2014/07/30'))) 
     var button = app.createButton('Confirmer'); 
     var handler = app.createServerClickHandler('bkpToSheet'); 
     handler.addCallbackElement(grid); 
     var cHandler = app.createClientHandler().forTargets(wait).setVisible(true); 
     button.addClickHandler(handler).addClickHandler(cHandler); 
     grid.setWidget(3, 0,button).setWidget(3, 1, wait); 
     app.add(grid); 
     doc.show(app); 
    } 

    function bkpToSheet(e){ 
     var app = UiApp.getActiveApplication(); 
     var calNames = e.parameter.calendar.split(','); 
     var name = 'BACKUP-AGENDAS-DU-'+Utilities.formatDate(new Date(), FUS1, '[email protected]/mm').replace('/','h')+'-'+calNames.join('&'); 
     var ss = SpreadsheetApp.create(name) 
     ss.setSpreadsheetTimeZone(tz); 
     var ssId = ss.getId(); 
     try{var bkpFolder = DocsList.getFolder('Backup agendas')} 
     catch(err){var bkpFolder = DocsList.createFolder('Backup agendas')} 
     DocsList.getFileById(ssId).addToFolder(bkpFolder); 
     DocsList.getFileById(ssId).removeFromFolder(DocsList.getRootFolder()); 
     for(n=0;n<calNames.length;++n){ 
     var sh = ss.insertSheet(calNames[n]); 
    //Logger.log(calNames[n])  
      var eventArray = []; 
      var startDate = new Date(e.parameter.start); 
      var endDate = new Date(e.parameter.end); 
      var Calendar = CalendarApp.getCalendarsByName(calNames[n]); 
      var events = Calendar[0].getEvents(startDate , endDate); 
      if (events[0]){ 
      var line = new Array(); 
      for (i = 0; i < events.length; i++) { 
       line = new Array(); 
       var guestList = events[i].getGuestList(false); 
       var guests = []; 
       var guestsName = [] 
       for(g=0;g<guestList.length;++g){ 
       guests.push(guestList[g].getEmail()); 
       guestsName.push(guestList[g].getName()); 
       } 
       FUS1=events[i].getStartTime().toString().substr(25,6)+":00"; 
       var title = events[i].getTitle() 
       line.push(title); 
       line.push(Utilities.formatDate(events[i].getStartTime(), FUS1, 'yyyy/MM/dd HH:mm:ss')); 
       line.push(Utilities.formatDate(events[i].getEndTime(), FUS1, 'yyyy/MM/dd HH:mm:ss')); 
       line.push(events[i].getLocation()); 
       line.push(events[i].getCreators()); 
       line.push(guests.join(',')) 
       line.push(guestsName.join(',')) 
       line.push((events[i].getEndTime() - events[i].getStartTime())/3600000); 
       line.push(events[i].getDescription()) 
       eventArray.push(line); 
      } 
      } 
      var titre = ["Backup de l'Agenda de "+calNames[n],'Début ','Fin','Lieu/ressources','Créateur','invités (lien)','invités (nom)','durée','description']; 
      eventArray.unshift(titre); 
      sh.getRange(1,1,eventArray.length,eventArray[0].length).setValues(eventArray); 
     } 
     ss.setActiveSheet(ss.getSheets()[0]); 
     var delSheet = ss.deleteActiveSheet(); // delete first empty sheet 
     var app = UiApp.getActiveApplication(); 
     app.close(); 
     return app; 
    } 

    function restore(){ 
     ScriptProperties.setProperty('restorePointers',[0,0].join('@')) 
     var app = UiApp.createApplication().setTitle("Restauration d'agenda à partir des BACKUPS Google Spreadsheets"); 
     app.setHeight(225).setWidth(780); 
     var doc = SpreadsheetApp.getActiveSpreadsheet(); 
     var waitR = app.createImage('https://dl.dropboxusercontent.com/u/211279/loading3T.gif').setId('waitR').setVisible(false); 
     var wait = app.createImage('https://dl.dropboxusercontent.com/u/211279/loading3.gif').setId('wait').setVisible(false); 
     var handlerContinueRestore = app.createServerHandler('continueRestore'); 
     var handlerCancelRestore = app.createServerHandler('cancelRestore'); 
     var cliHandlerContinue = app.createClientHandler().forEventSource().setEnabled(false).setHTML('Merci, reprise de la restauration').forTargets(waitR).setVisible(true); 
     var cont = app.createButton('continuer la restauration',handlerContinueRestore).setId('continue') 
     .setStyleAttributes({'fontSize':'12px', padding:'5px', borderRadius:'4px 4px 4px 4px',borderColor:'#ff0000',borderWidth:'2px'}).addClickHandler(cliHandlerContinue); 
     var cancel = app.createButton("Annuler la restauration.", handlerCancelRestore).setId('cancel') 
     .setStyleAttributes({'fontSize':'12px', padding:'5px', borderRadius:'4px 4px 4px 4px',borderColor:'#ff0000',borderWidth:'2px'}); 
     var msgHTML = app.createHTML().setId('msgHTML').setStyleAttributes({'fontSize':'12px', 'padding':'25px', 'borderRadius':'4px 4px 4px 4px','borderColor':'#ff0000','borderWidth':'2px'}); 
     var popPanel = app.createVerticalPanel().setPixelSize(587,137).setId('popPanel').setStyleAttributes({background:'#ffffcc',padding:'25px', borderRadius:'12px 12px 12px 12px',borderColor:'#ff0000',borderWidth:'1px'}).setVisible(false); 
     var popGrid = app.createGrid(2,3).setWidth('500'); 
     popPanel.add(msgHTML).add(popGrid); 
     popGrid.setWidget(0,0,cont).setWidget(0,1,cancel).setWidget(0, 2, waitR); 
     var cHandler = app.createClientHandler().forTargets(wait).setVisible(true); 
     var wHandler = app.createClientHandler(); 
     var grid = app.createGrid(5, 2).setId('grid').addClickHandler(wHandler); 
     var dateHandler = app.createServerHandler('restoreDate').addCallbackElement(grid); 
     var chkGrid = app.createGrid(1, 7); 
      chkGrid.setText(0, 0, 'ressources/invités à restaurer :') 
       .setWidget(0, 1, app.createCheckBox('@salles').setName('salles')) 
       .setWidget(0, 2, app.createCheckBox('#cours').setName('cours')) 
       .setWidget(0, 3, app.createCheckBox('profs').setName('profs')) 
       .setWidget(0, 4, app.createCheckBox('Dates partielles').setName('dates').addClickHandler(dateHandler).addClickHandler(cHandler)); 
     var list = app.createListBox().setName('bkpname').addItem('- - -'); 
     var listS = app.createListBox().setName('sourceCal').addItem('- - -'); 
     var listD = app.createListBox().setName('targetCal').addItem('- - -'); 
     grid.setText(0, 0, "Backup à utiliser :"); 
     grid.setWidget(0, 1, list); 
     grid.setText(1, 0, "Agenda de la feuille (source) :"); 
     grid.setWidget(1, 1, listS); 
     grid.setText(2, 0, "Agenda cible(destination) :"); 
     grid.setWidget(2, 1, listD); 
     var bkps = DocsList.find('BACKUP-AGENDAS-DU-'); 
     var bkpList = []; 
     for(n=0;n<bkps.length;++n){ 
    //Logger.log(bkps[n].getName()+' '+bkps[n].getId()) 
     if(bkps[n].getName().indexOf('BACKUP-AGENDAS-DU-')>-1){ 
      list.addItem(bkps[n].getName(),bkps[n].getId()) 
     } 
     } 
     var calendars = CalendarApp.getAllCalendars(); 
     for (var i = 0; i < calendars .length; i++) { 
     listS.addItem(calendars[i].getName(),calendars[i].getId()); 
     listD.addItem(calendars[i].getName(),calendars[i].getId()); 
     } 
     var dateDeb = app.createListBox().setId('dateDeb').setName('dateDeb').setVisible(false).addChangeHandler(dateHandler).addItem('première date disponible','xxxxxxxxxx'); 
     var dateFin = app.createListBox().setId('dateFin').setName('dateFin').setVisible(false).addChangeHandler(dateHandler).addItem('dernière date disponible','xxxxxxxxxx'); 
     var button = app.createButton('Confirmer').setId('button'); 
     var msg = app.createButton("cette opération peut être longue... veuillez patienter et attendre la disparition de cette fenêtre<BR>Vous pouvez voir la progression dans le bas de l'écran (date et nombre/total) " 
     +"<BR>ou interrompre la restauration en cliquant ici.",handlerCancelRestore).setVisible(false).setId('msg').setStyleAttributes({'fontSize':'12px', padding:'25px',background:'#ffffff',borderWidth:'0px'}); 
     var handler = app.createServerClickHandler('restoreCal'); 
     handler.addCallbackElement(grid); 
     var cHandler = app.createClientHandler().forEventSource().setVisible(false).forTargets(wait,msg).setVisible(true).forTargets(dateDeb,dateFin).setEnabled(false); 
    // var msgHandler = app.createClientHandler().forTargets(msg).setVisible(true).forTargets(dateDeb,dateFin).setEnabled(false); 
     button.addClickHandler(handler).addClickHandler(cHandler).setEnabled(false); 
     grid.setWidget(3, 0,button).setWidget(3, 1, chkGrid); 
     grid.setWidget(4, 0,dateDeb).setWidget(4, 1, dateFin); 
     var warning = app.createLabel("Veuillez d'abord sélectionner un document et les noms des agendas").setId('warning'); 
     wHandler.validateNotMatches(list, '- - -').validateNotMatches(listS, '- - -').validateNotMatches(listD, '- - -') 
       .forTargets(button).setEnabled(true).forTargets(warning).setVisible(false); 
     app.add(grid).add(warning).add(msg).add(popPanel).add(wait); 
     cHandler.forTargets(grid).setVisible(false); 
     doc.show(app); 
    } 


    function continueRestore(e){ 
     var app = UiApp.getActiveApplication(); 
     var popAlert = app.getElementById('popPanel'); 
     var grid = app.getElementById('grid'); 
     var msg = app.getElementById('msg').setVisible(false); 
     ScriptProperties.setProperty('startrestore',new Date().getTime().toString()); 
     // recover pointers to continue restore 
     var restoreData = ScriptProperties.getProperty('restoreData'); 
     e = Utilities.jsonParse(restoreData); 
     return restoreCal(e) 
    } 

    function cancelRestore(e){ 
     var app = UiApp.getActiveApplication(); 
     ScriptProperties.setProperty('restoreData','') 
     ScriptProperties.setProperty('restorePointers','canceled'); 
     SpreadsheetApp.getActiveSpreadsheet().toast(' ','restauration annulée'); 
     app.close(); 
     return app; 
    } 

    function restoreDate(e){ 
     var app = UiApp.getActiveApplication(); 
     var wait = app.getElementById('wait'); 
     var sourceCalId = e.parameter.sourceCal; 
     var sourceCal = CalendarApp.getCalendarById(sourceCalId); 
     var sourceCalName = sourceCal.getName(); 
     var ssId = e.parameter.bkpname; 
     if(!SpreadsheetApp.openById(ssId).getSheetByName(sourceCalName)){Browser.msgBox('pas de backup correspondant à cet agenda dans ce document');return app} 
     var data = SpreadsheetApp.openById(ssId).getSheetByName(sourceCalName).getDataRange().getValues(); 
     var deb = []; 
     var fin = []; 
     for(n=1;n<data.length;++n){ 
      deb.push([Utilities.formatDate(new Date(data[n][1]),tz,'dd-MM-yyyy'),n-1]); 
      fin.push([Utilities.formatDate(new Date(data[n][2]),tz,'dd-MM-yyyy'),n-1]); 
     } 
    //Logger.log(deb) 
     var dateDeb = []; 
     var dateFin = []; 
     for(n=deb.length-1;n>0;n--){if(deb[n][0]!=deb[n-1][0]){dateDeb.push(deb[n])}}; 
     for(n=fin.length-1;n>0;n--){if(fin[n][0]!=fin[n-1][0]){dateFin.push(fin[n])}}; 
     var debList = app.getElementById('dateDeb'); 
      debList.setVisible(true); 
     var finList = app.getElementById('dateFin'); 
      finList.setVisible(true); 
     if(e.parameter.dates=='false'){debList.setVisible(false);finList.setVisible(false)} 
     dateDeb.push(['première date disponible','xxxxxxxxxx']); 
     dateDeb.reverse(); 
     dateFin.unshift(['dernière date disponible','xxxxxxxxxx']); 
     if(e.parameter.dateDeb=='xxxxxxxxxx'){ 
      debList.clear(); 
      for(n=0;n<dateDeb.length;++n){debList.addItem(dateDeb[n][0],dateDeb[n][1])} 
     } 
     if(e.parameter.dateFin=='xxxxxxxxxx'){ 
      finList.clear(); 
      for(n=0;n<dateFin.length;++n){finList.addItem(dateFin[n][0],dateFin[n][1])} 
     } 
     wait.setVisible(false); 
     var cHandler = app.createClientHandler().forTargets(wait).setVisible(true); 
     app.getElementById('button').addClickHandler(cHandler); 
     return app; 
    } 


    function restoreCal(e){ 
     var lock = LockService.getPublicLock(); 
     var success = lock.tryLock(5000); 
     if (!success) { 
     Logger.log('tryLock failed to get the lock'); 
     return 
     } 
     ScriptProperties.setProperty('startrestore',new Date().getTime().toString()) 
     if(ScriptProperties.getProperty('restoreData')==''||ScriptProperties.getProperties().toString().indexOf('restoreData')==-1) 
      {ScriptProperties.setProperty('restoreData',Utilities.jsonStringify(e)) 
      } 
     var app = UiApp.getActiveApplication(); 
     var alert = app.getElementById('alert') 
     var ssId = e.parameter.bkpname; 
     var targetCalId = e.parameter.targetCal; 
     var targetCal = CalendarApp.getCalendarById(targetCalId); 
     var targetCalName = targetCal.getName(); 
     var sourceCalId = e.parameter.sourceCal; 
     var sourceCal = CalendarApp.getCalendarById(sourceCalId); 
     var sourceCalName = sourceCal.getName(); 
     var salles = e.parameter.salles =='true'; 
     var cours = e.parameter.cours == 'true'; 
     var profs = e.parameter.profs == 'true'; 
     var partiel = e.parameter.dates =='true'; 
    //Logger.log(SpreadsheetApp.openById(ssId).getNumSheets()+' '+sourceCalName + salles+cours+profs) 
     if(!SpreadsheetApp.openById(ssId).getSheetByName(sourceCalName)){Browser.msgBox('pas de backup correspondant à cet agenda dans ce document');lock.releaseLock(); return app} 
     var data = SpreadsheetApp.openById(ssId).getSheetByName(sourceCalName).getDataRange().getValues(); 
     var headers = data.shift(); 
    //Logger.log(headers) 
    //Logger.log(ssId+' '+targetCal) 
    // [Agendas de BaAC1, Début , Fin, Lieu/ressources, Créateur, invités(liens),invités(nom), durée, description] 
    // date format = 23/09/2013 12:45:00 
     var pointers = ScriptProperties.getProperty('restorePointers'); 
     if(pointers=='[email protected]'){ 
     if(partiel){ 
    //Logger.log(partiel+' '+e.parameter.dateDeb+' '+e.parameter.dateFin) 
     if(e.parameter.dateDeb.length < 5){var dStart = Number(e.parameter.dateDeb)}else{dStart=0}; 
     if(e.parameter.dateFin.length < 5){var dEnd = Number(e.parameter.dateFin)}else{dEnd=data.length}; 
     }else{ 
     var dStart=0;dEnd=data.length; 
     } 
     }else{ 
     dStart = Number(pointers.split('@')[0]); 
     dEnd = Number(pointers.split('@')[1]); 
     } 
     if(dStart>dEnd){dStart=dEnd} 
    //Logger.log(partiel+' de '+dStart+' à '+dEnd) 
    // main loop ------------------------ 
     for(var ee=dStart;ee<dEnd;++ee){ 
     var ccc = ScriptProperties.getProperty('restorePointers'); 
      if(ccc=='canceled'){ app.close() ; return app }; 
      if(new Date().getTime()-Number(ScriptProperties.getProperty('startrestore'))>260000){ ;// normal = 260000 mS 
       ScriptProperties.setProperty('restorePointers',[ee,dEnd].join('@')); 
       var popPanel = app.getElementById('popPanel').setVisible(true); 
       var msgHTML = app.getElementById('msgHTML').setHTML("la restauration n'est pas terminée...(encore "+(dEnd-ee) 
       +" éléments à restaurer sur "+dEnd+")<BR> veuillez cliquer ici et le processus reprendra là où il s'était arrêté"); 
       var msg = app.getElementById('msg').setVisible(false); 
       var wait = app.getElementById('wait').setVisible(false); 
       var waitR = app.getElementById('waitR').setVisible(false); 
       var cont = app.getElementById('continue').setEnabled(true).setHTML('continuer la restauration'); 
       var grid = app.getElementById('grid').setVisible(false); 
       lock.releaseLock();                     
       return app 
       } 
      var guests = ''; 
      var types = data[ee][6].split(','); 
      var typesLink = data[ee][5].split(','); 
      for(t=0;t<types.length;++t){ 
      if(types[t].indexOf('@')>-1 && salles){guests+=typesLink[t]+','; continue} 
      if(types[t].indexOf('#')>-1 && cours){guests+=typesLink[t]+','; continue} 
      if(profs){guests+=typesLink[t]+','} 
      } 
      if(guests.length>0){guests = guests.substring(0,guests.length-1)} 
    //Logger.log(targetCal.getName()+' '+ee+' '+ guests) 
      var options = {'guests':guests,'location':data[ee][3],'description':data[ee][8]} 
      try{ 
      targetCal.createEvent(data[ee][0], new Date(data[ee][1]), new Date(data[ee][2]), options); 
      Utilities.sleep(30); 
      }catch(error){ 
      app.add(app.createLabel('erreur du serveur :'+Utilities.jsonStringify(error)+ ' le processus devrait néanmoins continuer sans intervention de vore part')); 
      } 
    //Logger.log(ee+' '+data[ee][0]+' '+new Date(data[ee][1])+' '+ new Date(data[ee][2])+' '+guests) 
     if((ee%10==0)&&ee>0){SpreadsheetApp.getActiveSpreadsheet().toast(ee+' événements crées sur '+dEnd,Utilities.formatDate(new Date(data[ee][1]),tz,'dd-MMM-yyyy'))} 
     } 
    // end of main loop----------------- 
     ScriptProperties.setProperty('restoreData','') 
     ScriptProperties.setProperty('restorePointers',0+'@'+0); 
     SpreadsheetApp.getActiveSpreadsheet().toast(dEnd+' événements crées sur '+dEnd,'restauration terminée'); 
     app.close(); 
     lock.releaseLock(); 
     return app; 
    } 
+0

感謝Serge,看起來是正確的行 - 導出到電子表格,然後導入爲新事件。 這就是我爲學校設置的年度日曆 - 在Excel中設置爲單頁日曆進行審閱,然後轉換爲ical類型格式和導入。 – CPGS

+0

這很有趣...你如何從SS出口到ics? –

相關問題