0

하나의 Google 시트에서 여러 개의 Google 캘린더로 이벤트를 만드는 시트를 만들려고합니다. 나는 Mogsdad의이 게시물 Create Google Calendar Events from Spreadsheet but prevent duplicates에서 환상적인 해결책으로 수정 된 시트를 사용하고 있습니다. 그러나 나는 3 가지 다른 달력에 들어가기 위해 작업량을 3 배로 늘렸고 프로그래밍에 첫 걸음을 보내고 싶습니다. 내 생각은 한 걸음 더 나아가서 조건부와 동일한 이름을 가진 하나 또는 모든 세 개의 달력에서 (확인되지 ​​않음, 날짜 저장, 확인 됨) 중 하나를 포함하는 드롭 다운 열 (레이블이 지정된 상태)을 추가하려는 것입니다. 쓰러지 다.스프레드 시트의 여러 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 Events", 
    functionName : "exportEvents" 
    }]; 
    sheet.addMenu("Calendar Actions", entries); 
}; 

/** 
* Export events from spreadsheet to calendar 
*/ 
function exportEvents() { 
    var sheet = SpreadsheetApp.getActiveSheet(); 
    var headerRows = 1; // 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=0; i<data.length; i++) { 
    if (i < headerRows) continue; // Skip header row(s) 
    var row = data[i]; 
    var date = new Date(row[0]); // First column 
    var title = row[1];   // Second column 
    var tstart = new Date(row[2]); 
    tstart.setDate(date.getDate()); 
    tstart.setMonth(date.getMonth()); 
    tstart.setYear(date.getYear()); 
    var tstop = new Date(row[3]); 
    tstop.setDate(date.getDate()); 
    tstop.setMonth(date.getMonth()); 
    tstop.setYear(date.getYear()); 
    var loc = row[4]; 
    var desc = row[5]; 
    var id = row[6];    // Sixth column == eventId 
// Check if event already exists, delete it if it does 
try { 
    var event = cal.getEventSeriesById(id); 
    event.deleteEventSeries(); 
    row[6] = ''; // 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"), {description:desc,location:loc}); 
var newEvent = cal.createEvent(title, tstart, tstop, {description:desc,location:loc}).getId(); 
row[6] = newEvent; // Update the data array with event ID 
debugger; 
    } 
    // Record all event IDs to spreadsheet 
    range.setValues(data); 
} 

그래서 나는 달력뿐만 아니라 2 개의 추가 일정은 "확인"에 갈 수있는 새로운 정보를 정의 할 필요가 실현이다. 내 문제는 일련의 if 루프를 사용하여 3 개의 캘린더에 이벤트를 전달하는 방법을 알 수 없다는 것입니다. 캘린더를 추가하는 것이 좋습니다. "확인되지 않은 캘린더"에 나타나는 모든 이벤트는 해당 날짜까지 업 그레 이드 된 날짜를 저장하기 위해 추가되고 그 날짜로 설정되면 마지막으로 "확인 됨"으로 표시됩니다. 따라서 확정 된 사건은 3 개의 모든 달력에 나타나지만 확인되지 않은 사건은 거기에만 나타납니다.

저는 프로그래밍에있어서 아주 새로운 제품입니다. 제발 다른 사람들의 뻔뻔한 표절을 용납하고 변명하십시오. (덕분에 Mogsdad에게 감사드립니다) 나는 어떤 도움을 주셔서 감사합니다!

답변

0

프로그래밍에 오신 것을 환영합니다! 일단 문제가 생기면 사용하는 모든 Google 제품을 스크립트로 작성해야합니다. :)

질문을 올바르게 이해하면 exportEvents() 함수를 실행할 때 이벤트가 들어갈 일정을 선택할 수 있기를 원합니다. 이를 수행하는 몇 가지 방법이 있으며 추가 루프가 필요하지 않습니다! 개체를 사용하고 이름으로 개체를 참조 할 수 있습니다.

은 내가 먼저, 현재 calcalId을 정의 할 경우 어떻게 할 것인지, 다음과 같이 세 개의 캘린더를 정의하는 객체를 만들 수 있습니다 :

var cal1 = "[email protected]"; 
var cal2 = "string url for second calendar"; 
var cal3 = "string url for third calendar"; 
var calendars = { 
    Unconfirmed: CalendarApp.getCalendarById(cal1), 
    SaveTheDate: CalendarApp.getCalendarById(cal2), 
    Confirmed: CalendarApp.getCalendarById(cal3) 
} 
개체 calendars 이제 세 달력 등의 일정 개체를 포함

이 상태이고 이 개체입니다. 각 행의 데이터를 잡는 때 다음,

var cal = row[7]; 

지금, cal이 상태를 나타내는 문자열을 포함하는 추가합니다. 당신은 당신의 newEvent 정의에 하나 변경하여 체인의 큰 사용할 수있다 :

var newEvent = calendars[cal].createEvent(title, tstart, tstop, {description:desc,location:loc}).getId(); 

여기에서 일어나고있는 것은 calendars[cal] 인은 달력 테이블의 문자열에 해당하는 객체, 그런 다음 새 이벤트를 추가 할 수 가져옵니다.이렇게하려면 시트를 변경해야합니다. 상태 열의 레이블을 'Save the Date'에서 'SaveTheDate'로 변경하여 변수 이름과 일치 시키십시오. 그렇게해야 해!

편집 내가 if 문을 사용, 여러 캘린더에 이벤트를 추가하려면,하지만 당신은 루프가 필요하지 않습니다. 다음과 같은 것이 작동합니다.

calendars['Unconfirmed'].createEvent(title... // Add to unconfirmed no matter what 
if (cal != 'Unconfirmed'){ 
    calendars['SaveTheDate'].createEvent(title... // Add to SaveTheDate only if not Unconfirmed 
} 
if (cal == 'Confirmed'){ 
    calendars['Confirmed'].createEvent(title... // Only add to Confirmed if Confirmed 
} 
+0

안녕하세요, 티파니, 매우 감사합니다. 매우 도움이되고 잘 작동합니다. 나는 물어보고 싶은 후속 질문을 가지고있다. 나는 "확인 된"이벤트를 "SaveTheDate"와 "Unconfirmed"캘린더로 이동 한 다음 "Unconfirmed"캘린더 만 "Unconfirmed"캘린더로 이동하기 위해 "SaveTheDate"3 개의 모든 캘린더에 넣기를 원합니다. 나도 한 캘린더 만 선택하는 대신에 내가 어떻게 그것들을 보완 할 수 있는지 아십니까? 내 원래 생각에서 나는 "if"루프를 다음 각 캘린더에 보낼 것이지만 귀하의 방법은 나를 거기에있는 것처럼 느낄 수있는 단순한 방법! 사전에 감사드립니다 –

+0

내 대답보기 - 도움이 될만한 것을 추가했습니다. 유용하다고 생각되면 제 대답을 수락하십시오! –

+0

이전 답변을 삭제하기 전에 기존 이벤트를 삭제할 수있는 능력 (중복을 피하기 위해)을 잊었습니다. 내가 deleat 이벤트 라인도 업데이트 될 때까지 말입니다. {var event = calendars [ 'Unconfirmed']. getEventSeriesById (id); 모든 이벤트가 삭제되었습니다. 나는 try { var event = calendars [ 'Confirmed']로 2 개의 addtional try 및 catch 함수를 추가하려고 시도했다. getEventSeriesById (id); event.deleteEventSeries(); } catch (e) { }하지만 실제로 작동하지 않는 이유는 무엇입니까? –