【GAS】연간 행사 일정표를 1년간 정리해 캘린더에 기입한다

11766 단어 자바스크립트gas
학교의 연간 행사 예정표를 1년간 정리해 캘린더에 기입하는 GAS입니다.

Google이 지정하는 CSV 형식으로 미리 작성한 일정 목록을 캘린더 가져오기 기능을 사용하여 로드하면 캘린더에 일정을 정리해 쓸 수 있습니다만, 그것도 억권이 되어 왔으므로 이번 GAS로 단번에 쓸 수 있다 그렇게했습니다.

매우 초보적인 기능만으로 충분하기 때문에, GAS 프로그래밍 미경험자에게도 이해하기 쉬운 코드라고 생각합니다.

특징


  • 1년간 정리해 캘린더에 기입할 수 있다.
  • 특정일에 복수의 행사가 있는 경우에는 행사 1과 행사 2로 나누어 입력하는 것으로, 당일 최대 2개까지 행사를 기입할 수 있다.
  • 행사는 전일 취급으로 기입한다.
  • 각 학교마다 행사 예정표의 레이아웃이 달라도, 다운로드한 시트에 적절하게 매핑 시키면 폭넓게 대응 가능.

  • 쉬운 사용법



  • 연간 행사 일정표 to 캘린더(공개용)을 클릭하여 드라이브에 복사본을 만듭니다
  • .
  • 시트 안에서 변경해 좋은 것은 배경이 회색 부분(연도, 행사)만. 행사의 입력이 끝나면, 메뉴 바의 「도구」->「스크립트 에디터」를 연다. ※여기서 별도 시트에 각 학교마다의 캘린더를 붙여 놓고, 대응하는 데이터를 매핑시켜 두면 매년의 갱신 작업이 편합니다.
  • 13행째의 캘린더 ID를 연간 행사 일정을 기입하고 싶은 캘린더의 캘린더 ID로 변경해 보존. 캘린더 ID의 위치는 예를 들어, 캘린더 유형 및 주소를 확인하는 방법
    참조.
  • 실행 버튼을 누르면 GAS가 각종 어플리케이션에 대한 추가 권한을 요구하기 때문에 승인한다. 좌하의 「상세를 표시」를 누르면, 이하의 화면이 되므로 「YearScheduleForStudents(public)(안전하지 않은 페이지)에 이동」을 클릭해 앞으로 진행하면 된다.


  • 5. 스프레드 시트로 돌아가 새로 만든 메뉴 바의 "toCalendar"-> "캘린더에 출력"을 실행.
    6. 확인창이 표시되므로 문제가 없으면 「OK」로 지정한 캘린더에 행사 일정표가 기입된다.
    7. 실행 중에 오류가 발생하면 창에 오류 세부 정보가 표시되고 실행이 중지됩니다.

    코드.gs
    function onOpen() {
     const ui = SpreadsheetApp.getUi();
     const menu = ui.createMenu("toCalendar");
     menu.addItem("カレンダーへ出力", "myFunction");
     menu.addToUi();
    }
    
    function myFunction() {
      const ss = SpreadsheetApp.getActiveSpreadsheet();
      const sheet = ss.getSheetByName('年間行事予定表');
      const range = sheet.getDataRange().getValues();
    
      const id = 'カレンダーID'
      const calendar = CalendarApp.getCalendarById(id);
      const days = [];
    
      // イベント作成時にアイドル時間を作らないとGASが止まる。アイドル時間の200に根拠はない
      const THROTTLE_SLEEP_TIME = 200;
    
      // 日付を作成
      for(let i = 1; i < 276; i++){
        days.push(`${range[0][0]}/${range[i][0]}/${range[i][1]}`);
      }
      for(let i = 276; i < 367; i++){
        days.push(`${parseInt(range[0][0])+1}/${range[i][0]}/${range[i][1]}`);
      }
    
      range.shift();
      let result = Browser.msgBox("行事予定表をカレンダーに書き込みます。\\n 【注意】 この操作は取り消せません!",Browser.Buttons.OK_CANCEL);
      if(result == "ok"){
        try{
          for(let i = 0; i < days.length; i++){
            if(range[i][2] !== ''){
              const date = new Date(days[i]);
              calendar.createAllDayEvent(range[i][2], date);
              Utilities.sleep(THROTTLE_SLEEP_TIME);
            }
            if(range[i][3] !== ''){
              const date = new Date(days[i]);
              calendar.createAllDayEvent(range[i][3], date);
              Utilities.sleep(THROTTLE_SLEEP_TIME);
            }
          }
        }catch(e){
          Browser.msgBox(e);
        }
      }
    }
    

    보충(THROTTLE_SLEEP_TIME 정보)



    아무래도 GAS 실행시에 의도적으로 유휴 시간(THROTTLE_SLEEP_TIME)을 만들지 않으면 하루당 할당(캘린더 이벤트 작성수: 무료 계정 5000개, G Suite Basic 이상 10000개) 이내임에도 불구하고 오류로 멈춰 버립니다. 근무교의 행사 예정표는 THROTTLE_SLEEP_TIME=200(밀리 세컨드)으로 문제 없게 움직였습니다만, 이 수치는 이벤트수에 달려 있습니다. 새로 작성하는 이벤트가 적으면 0밀리초라도 오류가 발생하지 않을 수도 있습니다. 런타임에

    You have been creating or deleting too many calendars or calendar events in a short time. Please try again later.

    또는이 일본어 번역이 표시되면 스크립트 편집기에서 18 행의 THROTTLE_SLEEP_TIME 값을 조정해보십시오.

    이것에 관해서는 현재, 스크립트 실행 시간의 6분 제한을 의식하면서 조정할 수밖에 없을 것 같습니다.

    좋은 웹페이지 즐겨찾기