【GAS】 오늘 멤버의 모든 일정을 캘린더에서 자동 취득하여 Gmail로 통지
이 기사는 무엇입니까?
팀원의 당일의 스케줄 정도 메일로 정리해 자동으로 전달되지 않을까…
그런 생각이 없었습니까?
그 꿈이 이루어집니다.
Goole Apps Script
그럼.이 기사는 다음과 같은 점을 의식적으로 만든 GAS 프로그램입니다.
■ 메일 본문 이미지
작성·준비
① 준비하는 것
②도입까지의 흐름
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">📅</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
Reference
이 문제에 관하여(【GAS】 오늘 멤버의 모든 일정을 캘린더에서 자동 취득하여 Gmail로 통지), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/takachan_coding/items/cc07ea76c4d23eaf79c6텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)