見出し画像

【生成AI×GAS】営業日を逆算して締切期日設定

オレンジピーチのトシです。
生成AIを用いて「GASでメールを書く」スクリプトを作成する方法を紹介しています。
ここでは、一旦出来上がったGASのコードを修正して、より業務の効率化につながる形に改良を進めています。
今回は、そのGAS(Google Apps Script)のコードを修正し、月末から営業日を逆算して、締め切り期日設定するように変更を行いたいと思います。
GAS初心者の人、プログラム初心者の人でも、生成AIを活用して、GASのスクリプトを改良していく方法を知って頂ければHappyです。


今回の完成イメージ:やりたいこと

今回は、過去の記事で紹介した、「GASで部署名・氏名をメールに差し込む」スクリプトを修正して、本文中の締切日を動的に変化させたいと思います。
過去の記事については、こちらからご覧ください。

これまでに、スプレッドシートのリストに記載のあるメールアドレスに対して順にメールを送るGASを作成することが出来ました。

現在の送付するメールの内容の改善を進めています。

送付したいメール内容

送信したい内容は、次の通りです。
今回、ご紹介したいポイントは、本文中の締切期日(太字)の箇所です。

宛先:
スプレッドシートのB列に記載のあるメールアドレス 

件名:
月次進捗ファイル(2024年7月度)の更新依頼

本文:
株式会社オレンジピーチ

営業部 青森 太郎 様
おつかれさまです。
企画部の橙桃です。
2024年7月度の月次進捗ファイルの更新をお願いいたします。
締切は、**07月24日**となります。それまでに、リンクの月次進捗表を更新して下さい。

営業部 青森 太郎 月次進捗ファイル
URL: ********

どうぞよろしくお願いします。

修正したい内容を明確にする

 修正したい箇所は、月次進捗表の更新締切期日の表記です。
この期日をどのように設定したいのかを明確にします。
 今回のメールは、その月に入ってしばらくしてから、各担当者に月次進捗表の更新を依頼するメールを想定しています。
 そのため、期日で 『何月』 を表すかは、「GASが実行された日付」と同じ月の値としたいと思います。
(つまり、7月にGASが実行されたら「7月」、8月に実行されたら「8月」となる)
 次に、期日で『何日』を表すかは、「月末最終日から逆算して5営業日前」としたいです。土日祝を休みとして、それ以外の平日が営業日となるようにしたいと思います。
月の違いや、うるう年によって月末最終日は28日、29日、30日、31日といくつものパターンの可能性があります。
また、土日や祝日が入ったり、三連休の可能性もあります。
(どんな方法があるかは分かりませんが、そのあたりは生成AIに考えてもらいましょう!)

修正をゴールイメージが定まったので、実際にコードを修正していきます。

生成AIを使ってGASを修正する

今回は、OpneAIのChatGPTを使用しました。無料版を利用しましたがGPT-4のようです。

https://openai.com/chatgpt/

生成AIの安全性については、様々な議論が行われているため、会社等で使う場合は、自社の利用規定などを確認してから使用してください。 加えて、個人情報などは入力しないか、生成AIごとの推奨に基づいた形での利用をお薦めします。特に今回は、メール送信というテーマ上、相手先の名称や人名、メールアドレスが含まれる内容となります。

生成AIに指示を出す際には、ダミーの名称やアドレスを使うなどの方法も考慮ください。

徐々に内容が難しくなっているので、解決の方法にいくつもの可能性があります。そのため、使用する生成AIによって、回答が異なってくる場合があります。
実際に今回の修正指示に対して、ChatGPTと、Google Gemini は同じような解決方法を提示しましたが、Microsoft Copilot は異なる解決方法を提示して来ました。
どの方法も、目的のメールを送信することは出来ましたが、この記事をご覧になった人が生成AIを利用して回答を得た際には、違う回答となる可能性があることを理解して読み進めて頂ければと思います。

生成AIに指示を出す。

生成AI(ChatGPT-4)には、修正したい内容を書いた上で、現在のGASコードを貼り付けて指示を出しました。
営業日の設定をどのように計算するかは、具体的な指示は出さずに進めてみます。
指示文には、「修正内容に質問があれば、行ってください。」との一文を加えました。
これによって、もし指示の内容に不足があれば、AIが判断して足りない部分を問い返してくれます。

生成AIに指示した内容


下記のようなGAS(Google Apps Script)のスクリプトがあります。
このGASを修正して、次の内容を組み込んでください。
修正内容に質問があれば、行ってください。

#修正したいポイント:  
締め切り日が「**7月25日**」となっている箇所を修正して、  
月末最終日から5営業部前の日付となるように修正してください。  
営業日の設定では、日本の祝祭日以外の日を営業日としてください。

#現在の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 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 += "締切は、**7月25日**となります。それまでに、リンクの月次進捗表を更新して下さい。\n";
body += "\n"; body += ${department}部 ${name} 月次進捗ファイル\nURL: ********\n; body += "\n";
body += "どうぞよろしくお願いします。";

MailApp.sendEmail({
  to: recipient,
  subject: subject,
  body: body
  });
 }
}

現在(修正前)のGASのコード

生成AIからの返事が届く

すぐに返事が返ってきました。
GoogleカレンダーAPIを使うことで、日本の祝日が取得できるようです。

日本の祝日を考慮し、月末最終日から5営業日前の日付を計算するための機能を組み込んだ修正済みのGASコードを提供します。

まず、Google Apps Scriptでは標準ライブラリに祝日を取得する機能がないため、GoogleカレンダーAPIを使用して日本の祝日を取得します。そのためにはGoogleカレンダーAPIを有効にし、APIキーを取得する必要があります。また、スクリプト内でAPIキーを使用します。

次に、営業日を計算する関数を作成し、月末最終日から5営業日前の日付を求めます。

以下が修正済みのGASコードです:

生成AIからの回答(最初の部分)

提案された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;
}

このスクリプトでは、`calculateBusinessDay` 関数が月末最終日から5営業日前の日付を計算し、その日付を本文に組み込みます。祝日は `isHoliday` 関数でGoogleカレンダーAPIを使用して確認しています。GoogleカレンダーAPIを使用するには、APIキーの設定が必要です。Google Apps ScriptのプロジェクトでGoogleカレンダーAPIを有効にし、適切なAPIキーを取得してください。APIキーの設定方法について質問があれば教えてください。

生成AIからの回答(最後の部分)

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です。

今回は以上です。最後まで読んで頂き、ありがとうございました。
記事の内容が参考になった方は、「スキ」して頂けると励みになります。

いいなと思ったら応援しよう!

オレンジピーチ★トシ
この記事が少しでもお役に立てたのなら、サポートいただけると嬉しいです。頂いたご支援は、今後の活動費やコンテンツの質向上に使わせていただきます。