【生成AI×GAS】営業日を逆算して締切期日設定
オレンジピーチのトシです。
生成AIを用いて「GASでメールを書く」スクリプトを作成する方法を紹介しています。
ここでは、一旦出来上がったGASのコードを修正して、より業務の効率化につながる形に改良を進めています。
今回は、そのGAS(Google Apps Script)のコードを修正し、月末から営業日を逆算して、締め切り期日設定するように変更を行いたいと思います。
GAS初心者の人、プログラム初心者の人でも、生成AIを活用して、GASのスクリプトを改良していく方法を知って頂ければHappyです。
今回の完成イメージ:やりたいこと
今回は、過去の記事で紹介した、「GASで部署名・氏名をメールに差し込む」スクリプトを修正して、本文中の締切日を動的に変化させたいと思います。
過去の記事については、こちらからご覧ください。
これまでに、スプレッドシートのリストに記載のあるメールアドレスに対して順にメールを送るGASを作成することが出来ました。
現在の送付するメールの内容の改善を進めています。
送付したいメール内容
送信したい内容は、次の通りです。
今回、ご紹介したいポイントは、本文中の締切期日(太字)の箇所です。
修正したい内容を明確にする
修正したい箇所は、月次進捗表の更新締切期日の表記です。
この期日をどのように設定したいのかを明確にします。
今回のメールは、その月に入ってしばらくしてから、各担当者に月次進捗表の更新を依頼するメールを想定しています。
そのため、期日で 『何月』 を表すかは、「GASが実行された日付」と同じ月の値としたいと思います。
(つまり、7月にGASが実行されたら「7月」、8月に実行されたら「8月」となる)
次に、期日で『何日』を表すかは、「月末最終日から逆算して5営業日前」としたいです。土日祝を休みとして、それ以外の平日が営業日となるようにしたいと思います。
月の違いや、うるう年によって月末最終日は28日、29日、30日、31日といくつものパターンの可能性があります。
また、土日や祝日が入ったり、三連休の可能性もあります。
(どんな方法があるかは分かりませんが、そのあたりは生成AIに考えてもらいましょう!)
修正をゴールイメージが定まったので、実際にコードを修正していきます。
生成AIを使ってGASを修正する
今回は、OpneAIのChatGPTを使用しました。無料版を利用しましたがGPT-4のようです。
徐々に内容が難しくなっているので、解決の方法にいくつもの可能性があります。そのため、使用する生成AIによって、回答が異なってくる場合があります。
実際に今回の修正指示に対して、ChatGPTと、Google Gemini は同じような解決方法を提示しましたが、Microsoft Copilot は異なる解決方法を提示して来ました。
どの方法も、目的のメールを送信することは出来ましたが、この記事をご覧になった人が生成AIを利用して回答を得た際には、違う回答となる可能性があることを理解して読み進めて頂ければと思います。
生成AIに指示を出す。
生成AI(ChatGPT-4)には、修正したい内容を書いた上で、現在のGASコードを貼り付けて指示を出しました。
営業日の設定をどのように計算するかは、具体的な指示は出さずに進めてみます。
指示文には、「修正内容に質問があれば、行ってください。」との一文を加えました。
これによって、もし指示の内容に不足があれば、AIが判断して足りない部分を問い返してくれます。
生成AIからの返事が届く
すぐに返事が返ってきました。
GoogleカレンダーAPIを使うことで、日本の祝日が取得できるようです。
提案されたGASがこちらです。
function sendEmail() {
// スプレッドシートを開く
var sheet = SpreadsheetApp.getActiveSheet();
// A列2行目から最終行までの氏名を取得
var nameRange = sheet.getRange("A2:A" + sheet.getLastRow());
var nameList = nameRange.getValues();
// B列2行目から最終行までのメールアドレスを取得
var emailRange = sheet.getRange("B2:B" + sheet.getLastRow());
var emailList = emailRange.getValues();
// C列2行目から最終行までの部署名を取得
var departmentRange = sheet.getRange("C2:C" + sheet.getLastRow());
var departmentList = departmentRange.getValues();
// 現在の日付を取得
var today = new Date();
var year = today.getFullYear();
var month = today.getMonth() + 1; // 月は0始まりなので、+1する
// 営業日を計算する関数を呼び出す
var deadline = calculateBusinessDay(year, month);
// 件名を設定
var subject = `月次進捗ファイル(${year}年${month}月度)の更新依頼`;
// 各メールアドレスにメールを送信
for (var i = 0; i < emailList.length; i++) {
var recipient = emailList[i][0];
var name = nameList[i][0];
var department = departmentList[i][0];
// 本文を設定
var body = "";
body += "株式会社オレンジピーチ \n";
body += "\n";
body += `${department}部 ${name} 様\n`;
body += "おつかれさまです。\n";
body += "企画部の橙桃です。\n";
body += `${year}年${month}月度の月次進捗ファイルの更新をお願いいたします。\n`;
body += `締切は、**${deadline}**となります。それまでに、リンクの月次進捗表を更新して下さい。\n`;
body += "\n";
body += `${department}部 ${name} 月次進捗ファイル\nURL: ********\n`;
body += "\n";
body += "どうぞよろしくお願いします。";
MailApp.sendEmail({
to: recipient,
subject: subject,
body: body
});
}
}
function calculateBusinessDay(year, month) {
// 月末日を取得
var lastDay = new Date(year, month, 0);
// 営業日を数える変数
var businessDays = 0;
// 営業日を5日戻るまでループ
while (businessDays < 5) {
lastDay.setDate(lastDay.getDate() - 1);
// 土曜日または日曜日ならカウントしない
if (lastDay.getDay() === 0 || lastDay.getDay() === 6) {
continue;
}
// 祝日ならカウントしない
if (isHoliday(lastDay)) {
continue;
}
// 営業日をカウント
businessDays++;
}
// 日付を文字列で返す
return Utilities.formatDate(lastDay, Session.getScriptTimeZone(), 'MM月dd日');
}
function isHoliday(date) {
// GoogleカレンダーAPIを使用して祝日を確認
var calendarId = 'ja.japanese#holiday@group.v.calendar.google.com';
var events = CalendarApp.getCalendarById(calendarId).getEventsForDay(date);
return events.length > 0;
}
GAS(Google Apps Script)を修正する
内容に重篤な間違いは無いようなので、早速、現在のGASに生成AIから提示されたコードを上書きします。
GASが実行されると、メールが送信される
GASが実行されると、スプレッドシートに記載されているメールアドレスに、個々にメールが届きました。
締切は、「07月24日」となっています。
今年(2024年)は、27日が土曜日、28日が日曜日のため、月末最終日(7/31)の5営業日前は、7月24日で正しいです。
まとめ
今回は、生成AIを用いてGASを修正し、「月末から営業日を逆算して、締め切り期日設定する」方法を紹介しました。
これまでは、GASによって「スプレッドシート」と「Gmail」を操作して来ましたが、今回は「Googleカレンダー」も使用しているようです。
詳しくは、次回より解説を進めて行きたいと思いますが、このように、GAS(Google Apps Script)ではGoogleの様々なサービスを連携して、より複雑な操作を自動化することが可能です。
この記事を読んで頂いた人に、GASの可能性が伝わればHappyです。
今回は以上です。最後まで読んで頂き、ありがとうございました。
記事の内容が参考になった方は、「スキ」して頂けると励みになります。