ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 아이폰-구글 캘린더-구글 시트 자동화(시간 순서에 맞도록 재배열)
    AppsScript 2023. 12. 8. 22:43

    아이폰 캘린더-구글 캘린더 연동(선택적 동기화)

    아이폰 캘린더에서 구글 캘린더로 연결하는 방법은 설정 > 캘린더 > 계정 > 계정 추가 > 데이터 업데이트 '자동 설정' 을 통해서 캘린더를 연결하고 아이폰 캘린더에서 일정 작성시 캘린더 선택에서 추가 해준 계정을 선택해서 일정을 올리면 '구글 캘린더'에도 동일하게 반영됩니다.

    설정 > 캘린더
    설정 > 캘린더
    캘린더 > 계정
    캘린더 > 계정
    계정 > 계정 추가
    계정 > 계정 추가

    시간 순서에 맞춰 새로운 이벤트를 적절한 위치에 삽입하는 기능을 구현하기 위해 Google Apps Script를 수정할 필요가 있습니다. 이를 위해서는 다음 단계를 따르면 됩니다:

    1. 이벤트 정렬: 가져온 이벤트를 시간 순서대로 정렬합니다. Google Calendar API는 기본적으로 이벤트를 시간 순으로 반환하지만, 확실하게 하기 위해 스크립트 내에서 정렬 로직을 추가할 수 있습니다.
    2. 적절한 위치에 삽입: 스프레드시트의 데이터를 검토하여 새 이벤트가 삽입될 적절한 위치를 찾습니다. 이벤트의 시작 시간을 기준으로 기존 데이터와 비교하여 새 이벤트가 들어갈 위치를 결정합니다.
    3. 중복 확인 및 삽입: 중복이 없는 것을 확인한 후, 새 이벤트를 스프레드시트의 해당 위치에 삽입합니다. 이를 위해 Google Sheets API의 insertRowBefore 또는 insertRowAfter 메소드를 사용할 수 있습니다.

    iPhone Calendar, Google Calendar, Google Sheets.

     

    아래는 이러한 기능을 포함한 간단한 코드 예시입니다:

    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 순으로 데이터를 구글 시트에 기록합니다. 기존 데이터와의 중복 확인과 적절한 위치에 삽입하는 로직은 이전과 동일합니다.

Designed by Tistory.