-
아이폰-구글 캘린더-구글 시트 자동화(시간 순서에 맞도록 재배열)AppsScript 2023. 12. 8. 22:43
아이폰 캘린더-구글 캘린더 연동(선택적 동기화)
아이폰 캘린더에서 구글 캘린더로 연결하는 방법은 설정 > 캘린더 > 계정 > 계정 추가 > 데이터 업데이트 '자동 설정' 을 통해서 캘린더를 연결하고 아이폰 캘린더에서 일정 작성시 캘린더 선택에서 추가 해준 계정을 선택해서 일정을 올리면 '구글 캘린더'에도 동일하게 반영됩니다.
시간 순서에 맞춰 새로운 이벤트를 적절한 위치에 삽입하는 기능을 구현하기 위해 Google Apps Script를 수정할 필요가 있습니다. 이를 위해서는 다음 단계를 따르면 됩니다:
- 이벤트 정렬: 가져온 이벤트를 시간 순서대로 정렬합니다. Google Calendar API는 기본적으로 이벤트를 시간 순으로 반환하지만, 확실하게 하기 위해 스크립트 내에서 정렬 로직을 추가할 수 있습니다.
- 적절한 위치에 삽입: 스프레드시트의 데이터를 검토하여 새 이벤트가 삽입될 적절한 위치를 찾습니다. 이벤트의 시작 시간을 기준으로 기존 데이터와 비교하여 새 이벤트가 들어갈 위치를 결정합니다.
- 중복 확인 및 삽입: 중복이 없는 것을 확인한 후, 새 이벤트를 스프레드시트의 해당 위치에 삽입합니다. 이를 위해 Google Sheets API의 insertRowBefore 또는 insertRowAfter 메소드를 사용할 수 있습니다.
아래는 이러한 기능을 포함한 간단한 코드 예시입니다:
function importCalendarEvents() { var sheet = SpreadsheetApp.getActiveSheet(); var calendar = CalendarApp.getDefaultCalendar(); var now = new Date(); var events = calendar.getEventsForDay(now); var sheetData = sheet.getDataRange().getValues(); for (var i = 0; i < events.length; i++) { var event = events[i]; var eventId = event.getId(); var eventStartTime = event.getStartTime(); var isDuplicate = false; var insertPosition = -1; // 기존 이벤트와 비교하여 중복 확인 및 삽입 위치 결정 for (var j = 0; j < sheetData.length; j++) { var row = sheetData[j]; var rowTime = new Date(row[1]); // 이벤트 시작 시간이 기록된 열을 가정 if (row.indexOf(eventId) > -1) { isDuplicate = true; break; } else if (rowTime > eventStartTime && insertPosition === -1) { insertPosition = j + 1; } } // 중복되지 않은 경우 적절한 위치에 삽입 if (!isDuplicate) { if (insertPosition === -1) { sheet.appendRow([event.getTitle(), eventStartTime, event.getEndTime(), event.getDescription(), eventId]); } else { var range = sheet.getRange(insertPosition, 1); sheet.insertRowBefore(range.getRow()); sheet.getRange(insertPosition, 1, 1, 5).setValues([[event.getTitle(), eventStartTime, event.getEndTime(), event.getDescription(), eventId]]); } } } }
이 코드는 새 이벤트의 시작 시간을 기존 이벤트와 비교하여 적절한 위치를 찾고, 중복되지 않는 경우 그 위치에 새 이벤트를 삽입합니다. 이를 통해 시간 순서대로 이벤트를 정렬할 수 있습니다.
가져오는 배열 변경
시간> 제목 > 설명 순으로 나열하고 싶어서 배열을 수정해보았습니다.
코드를 수정하여 event.getStartTime(), event.getTitle(), event.getDescription(), eventId 순으로 데이터가 작성되도록 변경하겠습니다. 아래는 수정된 코드입니다:
function importCalendarEvents() { var sheet = SpreadsheetApp.getActiveSheet(); var calendar = CalendarApp.getDefaultCalendar(); var now = new Date(); var events = calendar.getEventsForDay(now); var sheetData = sheet.getDataRange().getValues(); for (var i = 0; i < events.length; i++) { var event = events[i]; var eventId = event.getId(); var eventStartTime = event.getStartTime(); var isDuplicate = false; var insertPosition = -1; // 기존 이벤트와 비교하여 중복 확인 및 삽입 위치 결정 for (var j = 0; j < sheetData.length; j++) { var row = sheetData[j]; var rowTime = new Date(row[0]); // 이벤트 시작 시간이 기록된 열을 가정 if (row.indexOf(eventId) > -1) { isDuplicate = true; break; } else if (rowTime > eventStartTime && insertPosition === -1) { insertPosition = j + 1; } } // 중복되지 않은 경우 적절한 위치에 삽입 if (!isDuplicate) { var rowData = [eventStartTime, event.getTitle(), event.getDescription(), eventId]; if (insertPosition === -1) { sheet.appendRow(rowData); } else { var range = sheet.getRange(insertPosition, 1); sheet.insertRowBefore(range.getRow()); sheet.getRange(insertPosition, 1, 1, 4).setValues([rowData]); } } } }
이 코드는 이벤트의 시작 시간, 제목, 설명, ID 순으로 데이터를 구글 시트에 기록합니다. 기존 데이터와의 중복 확인과 적절한 위치에 삽입하는 로직은 이전과 동일합니다.