Skip to content

Instantly share code, notes, and snippets.

@hedgejanuary
Created June 14, 2018 05:46
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save hedgejanuary/5dc88ce81d4e5f749cbceac09aa963b2 to your computer and use it in GitHub Desktop.
Save hedgejanuary/5dc88ce81d4e5f749cbceac09aa963b2 to your computer and use it in GitHub Desktop.
Upon receipt of a request, email requested information.
//予定を自動返信する
function RespondingRequest() {
var list = "";
var s;
var CalInUse = [
// 使用するカレンダーのアドレスとそのラベリング
["xxxxxxxxxxxxxxxxxxxxxxx@group.calendar.google.com","■○○さんの予定\n"],
["xxxxxxxxxxxxxxxxxxxxxxx@group.calendar.google.com", "■不在予定(外出・休暇)\n"],
["xxxxxxxxxxxxxxxxxxxxxxx@group.calendar.google.com", "■本社・地域本社の予定\n"],
["xxxxxxxxxxxxxxxxxxxxxxx@group.calendar.google.com", "■○○オフィス予定\n"],
["xxxxxxxxxxxxxxxxxxxxxxx@group.calendar.google.com", "■〆切\n"],
["xxxxxxxxxxxxxxxxxxxxxxx@group.calendar.google.com", "■休業日\n"]
];
for(var i=0; i<CalInUse.length; i++){
s = ListUpEvents(CalInfo[i][0]);
if (s != "") list += CalInfo[i][1] + s + "\n";
};
// カスタム関数でリクエストの種類を取得する。
var ReqType = CheckRequest();
var ReqSender = ReqType[0];
// メール本文の内容
var FirstPart = ReqSender +"さん\n\nお疲れ様です。\n" + ReqType[2] + "の予定は以下のとおりです。ご確認くださいませ。\n\n";
// 省略文字の説明や、予定登録・変更の際の連絡先(現状、各人が入力する方法を取っていないため。)
var SecondPart = "Abbreviations:\n" +
"* NR = No Return\n\n"+
"この他に外出予定がある場合には, チームメール <xxxxxxxxxx@abc.com>宛にメール願います。カレンダーを更新いたします。\n"+
"e.g.\n04/01 09:00-10:00 不在: 打合せ @場所\n\n";
// リクエストフォームのアドレス
var ThirdPart = "最新の予定表が必要な場合には、下記リンクからリクエストをお送りください。\n" +
"<https://goo.gl/forms/xxxxxxxxxxxxxxx>\n";
if (list != "") {
var body = FirstPart + list + SecondPart + ThirdPart;
EmailToStaff (body)
};
};
/**
* フォームの回答から、リクエスト送信者情報を返す
* @param () なし
* @return (string, string, string, date, date) 依頼者、メールアドレス、依頼期間、開始日、終了日
* @customfunction
*/
function CheckRequest(){
var ss = SpreadsheetApp.getActiveSpreadsheet();
var RequestSheet = ss.getSheetByName('Form responses');
var EmailSheet = ss.getSheetByName('EmailAddress');
// データを配列に格納
var RequestValues = RequestSheet.getDataRange().getValues();
var EmailValues = EmailSheet.getDataRange().getValues();
// RequestValuesの最終インデックス
var rLastIndex = RequestValues.length-1;
// リクエストしたスタッフの名前を取得する
switch (RequestValues[rLastIndex][2]) {
case 'Office A':
var StaffName = RequestValues[rLastIndex][3];
break;
case 'Office B':
var StaffName = RequestValues[rLastIndex][4];
break;
};
// スタッフのメールアドレス一覧のスタッフの名前の列を一元配列にする。
var EmailVal = EmailSheet.getRange(1,1,EmailValues.length).getValues();
EmailVal = Array.prototype.concat.apply([],EmailVal);
// リクエストしたスタッフの名前が、メールアドレス一覧の配列の何番目にあるかを調べる。
var EmailIndex = EmailVal.indexOf(StaffName);
// リクエストしたスタッフのメールアドレス
var recipient = EmailValues[EmailIndex][1];
// リクエストしたスケジュールの種類
var CalendarType = RequestValues[rLastIndex][2];
// リクエストしたスケジュールの期間(何日後までのスケジュールがほしいのか)
var CalDays;
switch (CalendarType) {
case '明日':
CalDays = 1;
break;
case '今後7日間':
CalDays = 7;
break;
case '今後30日間':
CalDays = 30;
break;
};
var now = new Date();
var end = new Date(now.getTime() + (CalDays * 24 * 60 * 60 * 1000));
return [StaffName, recipient, CalendarType, now, end];
};
//予定をリストアップ
function ListUpEvents(cal_id){
var list = "";
var cal = CalendarApp.getCalendarById(cal_id);
// カスタム関数でリクエストの種類を取得する。
var ReqType = CheckRequest();
// リクエストされた期間の予定を取得
var now = ReqType[3];
var end = ReqType[4];
var timezone = "JST";
switch (ReqType[2]) {
case '明日':
var events = cal.getEventsForDay(end);
for(var i=0; i < events.length; i++){
s = "";
if (events[i].isAllDayEvent()) {
s += Utilities.formatDate(events[i].getAllDayStartDate(),timezone,"MM/dd\b\b");
} else {
s += Utilities.formatDate(events[i].getStartTime(),timezone,"MM/dd HH:mm");
s += Utilities.formatDate(events[i].getEndTime(), timezone,"-HH:mm\b\b");
}
s += events[i].getTitle();
list += s + "\n";
};
break;
case '今後7日間':
case '今後30日間':
var events = cal.getEvents(now, end);
for(var i=0; i < events.length; i++){
s = "";
if (events[i].isAllDayEvent()) {
var startDate = new Date(events[i].getStartTime());
var endDate = new Date(events[i].getEndTime());
if (((endDate - startDate)/(24 * 60 * 60 * 1000)) < 2) {
s += Utilities.formatDate(events[i].getAllDayStartDate(),timezone,"MM/dd\b\b");
} else {
endDate.setDate(endDate.getDate() - 1);
s += Utilities.formatDate(events[i].getAllDayStartDate(),timezone,"MM/dd\b");
s += Utilities.formatDate(endDate, timezone,"-\bMM/dd\b\b");
}
} else {
s += Utilities.formatDate(events[i].getStartTime(),timezone,"MM/dd HH:mm");
s += Utilities.formatDate(events[i].getEndTime(), timezone,"-HH:mm\b\b");
}
s += events[i].getTitle();
list += s + "\n";
};
break;
};
return list;
};
//リクエストしたスタッフへのメール返信
function EmailToStaff (emailBody){
// カスタム関数でリクエストの種類を取得する。
var ReqType = CheckRequest();
var recipient = ReqType[1];
var copiedRecipient = '';
var sender = 'XXXXXXXXX@abc.com';
var senderName = '山田 太郎';
var timezone = "JST"
var now = Utilities.formatDate(ReqType[3], timezone,"MM/dd")
var end = Utilities.formatDate(ReqType[4], timezone,"MM/dd")
switch (ReqType[2]) {
case '明日':
var subject = ReqType[2] +'の予定 (' + end + ')';
break;
case '今後7日間':
case '今後30日間':
var subject = ReqType[2] + 'の予定 (' + now + ' - ' + end + ')';
break;
};
var body = emailBody;
GmailApp.sendEmail(recipient,
subject,
body,
{
bcc:'',
cc: copiedRecipient,
from: sender,
name: senderName
});
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment