Last active
January 18, 2023 02:49
-
-
Save t-yamamoto-mercury-inc/65cf8526cfb2faa244dc1de1390f6083 to your computer and use it in GitHub Desktop.
休暇メンバー自動通知システム
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 参考:https://qiita.com/takachan_coding/items/7234781ac56a4734e62b | |
//メインで実行する関数 | |
function notifyGmail(){ | |
if (isHoliday() == false){ | |
var recipients = getRecipients(); | |
var [holidayMembers, remoteMembers] = getCalendar(); | |
var mailBody = '■■このメールはシステムからの自動配信です■■\n\n【本日の休暇予定】\n'; | |
if (holidayMembers.length == 0){ | |
mailBody += 'なし\n'; | |
} else{ | |
mailBody += ''; | |
holidayMembers.forEach(function(holidayMember){ | |
mailBody += '・' + holidayMember + '\n'; | |
}); | |
} | |
mailBody += '\n【本日の在宅勤務(リモートワーク)の予定】\n'; | |
if (remoteMembers.length == 0){ | |
mailBody += 'なし\n'; | |
} else{ | |
mailBody += ''; | |
remoteMembers.forEach(function(remoteMember){ | |
mailBody += '・' + remoteMember + '\n'; | |
}); | |
} | |
mailBody += '\n'; | |
mailBody += '※全日スケジュールに下記の文字が入っている方を判定してリストアップしています。\n'; | |
mailBody += ' 詳細は各自のカレンダーをご確認ください。\n'; | |
mailBody += ' 「休」「有給」「家族サービス」「リモート」「テレワーク」「在宅」\n'; | |
mailBody += '\n'; | |
mailBody += '※下記のためにメール送信しております。ネガティブな反応があれば中止しますので、山本までお願いいたします。\n'; | |
mailBody += ' ・休暇の人宛てにSlackを送らないため\n'; | |
mailBody += ' ・業務都合上、変則的な休暇日の方がいらっしゃるため\n'; | |
mailBody += ' ・休暇なのか在宅勤務(リモートワーク)なのかわかりやすくするため\n'; | |
//メールの作成 | |
GmailApp.sendEmail(recipients, '【共有】本日の休暇、在宅勤務(リモートワーク)のメンバー', mailBody); | |
} | |
} | |
//カレンダーから休みのメンバーリストを取得 | |
function getCalendar() { | |
var ss = SpreadsheetApp.getActiveSpreadsheet(); | |
var calendarMembersSheet = ss.getSheetByName("カレンダー取得先"); | |
var members = calendarMembersSheet.getRange(2, 1, calendarMembersSheet.getLastRow() - 1).getValues(); | |
var Ids = calendarMembersSheet.getRange(2, 2, calendarMembersSheet.getLastRow() - 1).getValues(); | |
var calendarIds = {}; | |
for (var i = 0, l = members.length; i < l; i++) { | |
calendarIds[members[i]] = Ids[i]; | |
} | |
var holidayMembers = []; | |
var remoteMembers = []; | |
// var myCalendars = []; | |
members.forEach(function(member){ | |
var calendarId = calendarIds[member]; | |
var myCalendar = CalendarApp.getCalendarById(calendarId); | |
// var memberName = myCalendar.getName(); | |
var startDate = new Date(); | |
console.log(member+":"+myCalendar); | |
if(myCalendar == null){ | |
return; | |
} | |
var myEvents = myCalendar.getEventsForDay(startDate); | |
myEvents.some(function(myEvent){ | |
var title = myEvent.getTitle(); | |
if( (title.match(/休/) || title.match(/有給/) || title.match(/家族サービス/)) | |
&& (!title.match(/休憩/) && !title.match(/休息/) ) ){// | |
// holidayMembers.push(memberName + 'さん(' + title + ')'); | |
//「カレンダー取得先」シートのA列で指定した名前が良い場合は上を削除してこちらを使用↓ | |
holidayMembers.push(member + 'さん(' + title + ')'); | |
return true; | |
} | |
if(title.match(/リモート/) || title.match(/テレワーク/) || title.match(/在宅/)){ | |
// remoteMembers.push(memberName + 'さん(' + title + ')'); | |
//「カレンダー取得先」シートのA列で指定した名前が良い場合は上を削除してこちらを使用↓ | |
remoteMembers.push(member + 'さん(' + title + ')'); | |
return true; | |
} | |
}); | |
}); | |
return [holidayMembers, remoteMembers]; | |
} | |
//送付先メンバーリストを取得 | |
function getRecipients(){ | |
var ss = SpreadsheetApp.getActiveSpreadsheet(); | |
var recipientsSheet = ss.getSheetByName("メール送信先"); | |
recipientsSheet.activate(); | |
var recipients = recipientsSheet.getRange(2, 2, recipientsSheet.getLastRow() - 1).getValues(); | |
return recipients; | |
} | |
//土日祝日を判定するスクリプト | |
//参考URL...https://qiita.com/jz4o/items/d4e978f9085129155ca6 | |
function isHoliday(){ | |
var today = new Date(); | |
//土日か判定 | |
var weekInt = today.getDay(); | |
if(weekInt <= 0 || 6 <= weekInt){ | |
return true; | |
} | |
//祝日か判定 | |
var calendarId = "ja.japanese#holiday@group.v.calendar.google.com"; | |
var calendar = CalendarApp.getCalendarById(calendarId); | |
var todayEvents = calendar.getEventsForDay(today); | |
if(todayEvents.length > 0){ | |
return true; | |
} | |
return false; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment