【GAS】 오늘 멤버의 모든 일정을 캘린더에서 자동 취득하여 Gmail로 통지

이 기사는 무엇입니까?



팀원의 당일의 스케줄 정도 메일로 정리해 자동으로 전달되지 않을까…
그런 생각이 없었습니까?

그 꿈이 이루어집니다. Goole Apps Script 그럼.

이 기사는 다음과 같은 점을 의식적으로 만든 GAS 프로그램입니다.
  • 스크립트 등은 기본 코피페로 OK!
  • 메일 송신처, 캘린더 취득처의 추가나 삭제는 스프레드 시트상에서 간단 관리!
  • 정각으로 송부, 토, 일, 공휴일은 보내지 않는다! (← 다른 사람의 기사를 참조했습니다)

  • ■ 메일 본문 이미지


    작성·준비



    ① 준비하는 것
  • Google 계정
  • Gmail
  • Google 캘린더 ( "다른 캘린더"에 얻고 싶은 회원을 등록해야합니다)
  • 스프레드 시트

  • ②도입까지의 흐름
  • 스프레드시트 준비
  • 스크립트 설명
  • 캘린더 등록
  • 가동 확인
  • 트리거 생성
  • 운영

  • 1. 스프레드시트 준비



    코드도 나오고 있지만 이번에는 두 개의 시트를 준비합니다.
  • 메일 대상
  • 캘린더 취득처

  • ※코드로 상기의 명칭을 사용하고 있으므로, 시트명은 그대로 해 주세요.

    ■「메일 송신처」 시트


    ■「캘린더 취득처」 시트


    각 시트에 A列に名前、B列にアドレスもしくはカレンダーID(基本は同じ)를 입력합니다.
    이 때, 마지막 행까지는 자동으로 취득합니다만, 그 사이에 공란이나 치는 실수가 있으면 에러가 됩니다.

    2. 스크립트 설명


    スプレッドシートツールスクリプトエディタ를 클릭하고,
    스크립트 편집기에 다음 소스를 작성합니다.
    //メインで実行する関数
    function notifyGmail() {
    
      let holiday = isHoliday();
    
      if (isHoliday() == false) {
        const recipients = getRecipients();
        let mailBody = '■■このメールはシステムからの自動配信です■■<br><br>【本日のメンバーのスケジュール】<br>';
        mailBody += getCalendar();
        mailBody += '<br>From メンバーのスケジュール教えちゃうbot (・∀・)'
    
        GmailApp.sendEmail(recipients, '【送付】本日のメンバーのスケジュール', '', { htmlBody: '<p>' + mailBody + '</p>' });
    
      }
    }
    
    function getCalendar() {
    
      //カレンダーのID(メールアドレス)を取得する
      const ss = SpreadsheetApp.getActiveSpreadsheet();
      const calendarMembersSheet = ss.getSheetByName("カレンダー取得先");
      const memberIds = calendarMembersSheet.getRange(2, 2, calendarMembersSheet.getLastRow() - 1).getValues();
      const memberNames = calendarMembersSheet.getRange(2, 1, calendarMembersSheet.getLastRow() - 1).getValues();
    
      //カレンダーのデータを取得する
      let i, j;
      let memberId;
      const startDate = new Date();
      let myCalendar;
      let title, startTime, endTime; //メール本文に使う部品
      let myEvents = [];
      let eachSchedules = '';
    
      for (let i = 0; i < memberIds.length; i++) {
        memberId = memberIds[i];
        myCalendar = CalendarApp.getCalendarById(memberId);
        myEvents = myCalendar.getEventsForDay(startDate)
        eachSchedules += ('<br>' + '' + memberNames[i].toString() + 'さんの予定' + '<a href= "https://calendar.google.com/calendar/embed?src=' + memberId.toString().replace('@', '%40') + '&ctz=Asia%2FTokyo">&#x1f4c5;</a><br>');
        if (myEvents.length == 0) {
          eachSchedules += ('・記載なし<br>');
        } else {
          for (let j = 0; j < myEvents.length; j++) {
            title = myEvents[j].getTitle();
            startTime = Utilities.formatDate(myEvents[j].getStartTime(), 'JST', 'HH:mm');
            endTime = Utilities.formatDate(myEvents[j].getEndTime(), 'JST', 'HH:mm');
            if (startTime == '00:00' || endTime == '00:00') {
              eachSchedules += ('・ 終 日 : ' + title + '<br>');
            } else {
              eachSchedules += ('' + startTime + "" + endTime + " : " + title + '<br>');
            }
          }
        }
      }
    
      return eachSchedules;
    
    }
    
    //送付先メンバーリストを取得
    function getRecipients() {
    
      const ss = SpreadsheetApp.getActiveSpreadsheet();
      const recipientsSheet = ss.getSheetByName("メール送信先");
      recipientsSheet.activate();
      const recipients = recipientsSheet.getRange(2, 2, recipientsSheet.getLastRow() - 1).getValues();
      return recipients;
    
    }
    
    //土日祝日を判定するスクリプト
    //参考URL...https://qiita.com/jz4o/items/d4e978f9085129155ca6
    function isHoliday() {
    
      const today = new Date();
    
      //土日か判定
      const weekInt = today.getDay();
      if (weekInt <= 0 || 6 <= weekInt) {
        return true;
      }
    
      //祝日か判定
      const calendarId = "ja.japanese#[email protected]";
      const calendar = CalendarApp.getCalendarById(calendarId);
      const todayEvents = calendar.getEventsForDay(today);
      if (todayEvents.length > 0) {
        return true;
      }
    
      return false;
    
    }
    

    3. 캘린더 등록



    여기는 잊기 쉽지만 매우 중요한 포인트입니다!
    캘린더 ID를 스프레드 시트에 작성하는 것만으로는 오류가 발생한다고 생각하므로,取得先のカレンダーは「他のカレンダー」に追加 합니다.



    4. 가동 확인



    여기까지 주면 가동 확인입니다.
    함수에서 notifyGmail를 선택하고 실행합니다.


    특히 에러가 일어나지 않고, 이하와 같은 메일을 수신할 수 있으면 OK입니다!


    5. 트리거 생성



    이번, 트리거는 매일 아침 출근전에 와 있으면 좋을까라고 생각했으므로 이하와 같이 설정했습니다.
    덧붙여서 시간을 정확하게 실행할 수 있는 방법 도 있는 것 같습니다.
    주말과 공휴일의 메일 전송 회피는 스크립트에서 설정되어 있습니다.



    6. 운영



    이것으로 설정이 완료됩니다.
    우선은 1주일 정도 스스로 운용해 보고, 괜찮을 것 같으면 동료에게도 보내 봅시다!

    소감



    최근 일정을 확인하는 경우가 많아, 수고를 생략하고 싶어서 만들었습니다.
    덧붙여 이전에 만든 기사 과 구성은 거의 같습니다…

    할 수 없거나, 불명점이 있으면 코멘트나 메시지를 부탁합니다!

    참고



    Apps Script | Google Developers
    【GAS】휴일·공휴일을 판정하는 함수 | Qiita

    좋은 웹페이지 즐겨찾기