0

나는 이것을 몇 주 동안 나 자신을 해결하려고 노력했지만, 나는 손실에 처해있다! 다른 답변에서 가져온이 스크립트를 수정하는 데 큰 도움이되었지만 여전히 중복을 작성하고 있습니다.Google 스프레드 시트에서 Google 캘린더로 이벤트 만들기 - 여전히 중복 된 항목에 문제가 있음

나에게 도움이되는 아이디어가 있습니까? 내가 놓친 게 명백한가요?

현재 스크립트 :

/** 
* 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() { 
    // check if the script runs for the first time or not, 
    // if so, create the trigger and PropertiesService.getScriptProperties() the script will use 
    // a start index and a total counter for processed items 
    // else continue the task 
    if(PropertiesService.getScriptProperties().getKeys().length==0){ 
    PropertiesService.getScriptProperties().setProperties({'itemsprocessed':0}); 
    ScriptApp.newTrigger('exportWHCs').timeBased().everyMinutes(5).create(); 
    } 
    // initialize all variables when we start a new task, "notFinished" is the main loop condition 
    var itemsProcessed = Number(PropertiesService.getScriptProperties().getProperty('itemsprocessed')); 
    var startTime = new Date().getTime(); 
    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, delete it if it does 
try { 
    var event = cal.getEventSeriesById(id); 
    event.deleteEventSeries(); 
    row[17] = ''; // Remove event ID  
    } 
catch (e) { 
    // do nothing - we just want to avoid the exception when event doesn't exist 
} 
//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 


    if(new Date().getTime()-startTime > 240000){ // if > 4 minutes 
     var processed = i+1;// save usefull variable 
     PropertiesService.getScriptProperties().setProperties({'itemsprocessed':processed}); 
     range.setValues(data); 
     return; 
    }  
    debugger; 
    } 
    // Record all event IDs to spreadsheet 
    range.setValues(data); 
} 




/** 
* Export events from spreadsheet to calendar 
*/ 
function exportDocs() { 
    // check if the script runs for the first time or not, 
    // if so, create the trigger and PropertiesService.getScriptProperties() the script will use 
    // a start index and a total counter for processed items 
    // else continue the task 
    if(PropertiesService.getScriptProperties().getKeys().length==0){ 
    PropertiesService.getScriptProperties().setProperties({'itemsprocessed':0}); 
    ScriptApp.newTrigger('exportDocs').timeBased().everyMinutes(5).create(); 
    } 
    // initialize all variables when we start a new task, "notFinished" is the main loop condition 
    var itemsProcessed = Number(PropertiesService.getScriptProperties().getProperty('itemsprocessed')); 
    var startTime = new Date().getTime(); 
    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, delete it if it does 
try { 
    var event = cal.getEventSeriesById(id); 
    event.deleteEventSeries(); 
    row[20] = ''; // Remove event ID  
} 
catch (e) { 
    // do nothing - we just want to avoid the exception when event doesn't exist 
} 
//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 


    if(new Date().getTime()-startTime > 240000){ // if > 4 minutes 
     var processed = i+1;// save usefull variable 
     PropertiesService.getScriptProperties().setProperties({'itemsprocessed':processed}); 
     range.setValues(data); 
     return; 
    }  
    debugger; 
    } 
    // Record all event IDs to spreadsheet 
    range.setValues(data); 
    } 

답변

0

나는 당신의 문제를 재현하려했다. 이벤트를 복제하지 않고 새 이벤트를 만들 수 있습니다. 나는 아래 코드로 시도했다.

function onOpen() { 
    var sheet = SpreadsheetApp.getActiveSpreadsheet(); 
    var entries = [{ 
    name : "Export WHCs", 
    functionName : "exportWHCs" 
    }]; 
    sheet.addMenu("Calendar Actions", entries); 
}; 

/** 
* Export events from spreadsheet to calendar 
*/ 
function exportWHCs() { 

    if(PropertiesService.getScriptProperties().getKeys().length==0){ 
    PropertiesService.getScriptProperties().setProperties({'itemsprocessed':0}); 
    ScriptApp.newTrigger('exportWHCs').timeBased().everyMinutes(5).create(); 
    } 
    // initialize all variables when we start a new task, "notFinished" is the main loop condition 
    var itemsProcessed = Number(PropertiesService.getScriptProperties().getProperty('itemsprocessed')); 
    var startTime = new Date().getTime(); 
    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]"; 
    Logger.log(calId); 
    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]); 
    var title = row[18];   
    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, delete it if it does 
try { 
    var event = cal.getEventSeriesById(id); 
    event.deleteEventSeries(); 
    row[17] = ''; // Remove event ID  
    } 
catch (e) { 
    // do nothing - we just want to avoid the exception when event doesn't exist 
} 
     var newEvent = cal.createEvent(title, tstart, tstop).addEmailReminder(5).getId(); 
row[17] = newEvent; // Update the data array with event ID 


    if(new Date().getTime()-startTime > 240000){ // if > 4 minutes 
     var processed = i+1;// save usefull variable 
     PropertiesService.getScriptProperties().setProperties({'itemsprocessed':processed}); 
     range.setValues(data); 
     return; 
    }  
    } 
    // Record all event IDs to spreadsheet 
    range.setValues(data); 
} 

또한 이벤트가 기본 달력을 형성 접근에 대해이 documentation에 언급 된 사항을 확인하십시오.

기존 이벤트를 삭제하고 동일한 값에 대해 새 이벤트를 추가하지는 않습니다.

희망 하시겠습니까?

+0

답변 해 주셔서 감사합니다. 내 캘린더가 해당 계정의 기본 캘린더가 아닙니다 ... 그게 문제 일 수 있습니까? – Ingrid