見出し画像

【生成AI×GAS】GmailにGoogleDriveフォルダのリンクを挿入

オレンジピーチのトシです。
生成AIを用いて「GASでメールを書く」スクリプトを作成する方法を紹介しています。
ここでは、一旦出来上がったGAS(Google Apps Script)のコードを修正して、より業務の効率化につながる形に改良を進めています。
今回は、Gmailの本文中にGoogleドライブのリンクを挿入する方法を紹介したいと思います。
GAS初心者の人、プログラム初心者の人でも、生成AIを活用して、GASのスクリプトを改良していく方法を知って頂ければHappyです。


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

今回は、過去の記事で紹介した、「営業日を逆算して締切期日設定」スクリプトを修正して、本文中のGoogleドライブフォルダへのリンクを動的に変化させたいと思います。
過去の記事については、こちらからご覧ください。

振り返り

①スプレッドシートのリストに記載のあるメールアドレスに対して、順にメールを送る。

送信先メールアドレス

②送付したいメール内容は下記の通り。
今回のポイントは、本文中の月次進捗ファイルのURL(太字)です。

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

送信メールのイメージ(宛先)

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

送信メールのイメージ(件名)

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

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

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


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

送信メールのイメージ(本文)

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

 修正したい箇所は、月次進捗表のURLリンクの箇所です。
このURLをどのように設定したいのかを明確にします。
 今回は、今後も月次進捗表が追加されることを想定し、Googleドライブ中に担当者毎のフォルダを作成して、そのフォルダへのリンクを表示するように修正していきます。

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

Googleドライブフォルダの準備とスプレッドシートの修正

まず、Googleドライブ中に、月次進捗表のフォルダを担当者の数だけ準備します。
Googleドライブであれば、場所はどこでも構いません。

担当者毎の月次進捗表フォルダを準備

フォルダIDをスプレッドシートに追記する

作成したGoogleドライブのフォルダのIDを取得します。
Googleドライブでは、フォルダやファイルが作成されると、それを一意に決めるIDが付与されます。(新規作成もしくは、アップロードされた時点で付与される)

フォルダIDは、各フォルダのURLから確認できます。
https://drive.google.com/drive/folders/ の後ろの部分がフォルダIDです。

GoogleドライブのフォルダID

担当者毎に作成したフォルダの「フォルダID」をスプレッドシートに追記します。

スプレッドシートに月次進捗表フォルダIDの列を追加

これでスプレッドシートの準備が出来ました。

生成AIを用いたGASの修正

次にGASの修正を行います。
今回は、生成AIとして、Microsoft Copilot を使用しました。

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

生成AI利用時の注意

徐々に内容が難しくなっているので、解決の方法にいくつもの可能性があります。そのため、使用する生成AIによって、回答が異なってくる場合があります。
この記事をご覧になった人が生成AIを利用して回答を得た際には、違う回答となる可能性があることを理解して読み進めて頂ければと思います。

回答が異なる可能性の注意

生成AIに指示を出す。

生成AI(Copilot)には、修正したいポイントを箇条書きで書いた上で、現在のGASコードを貼り付けて指示を出しました。
(文章が長文になるため、全文のプロンプトはこの記事の最後に【補足】として載せています。)

生成AIへの指示文(プロンプト)〔一部〕

生成AIからの回答

プロンプトを入力すると、すぐに返事が返ってきました。

生成AIからの回答(一部)

GASを修正する

生成AIから提案された「修正後のスクリプト」に従ってコードをコピペして、現在のGASを修正します。

(長文になるため、修正後のGAS全文はこの記事の最後に【補足】として載せています。)

GASが実行されると、メールが送信される

修正後、GASを実行すると、スプレッドシートに記載されているメールアドレスに、個々にメールが届きました。

メールごとに、月次進捗ファイルのURLが記載されています。
また、リンクは今回設定したそれぞれの担当のGoogleドライブフォルダに飛ぶようになっており、正しく機能しています。
(画像で載せているのは1例だけですが、スプレッドシートに記載の氏名・メールアドレス等の行数分のメールが発信されています。)

届いたメール

まとめ

今回は、生成AIを用いてGASを修正し、「本文中にGoogleドライブのリンクを挿入する方法」を紹介しました。
GASによって、「スプレッドシート」と「Gmail」を組み合わせて操作することで、個別の内容を盛り込んだメールを一斉に送信する方法がご理解いただけたと思います。
次回は、生成AIが修正したGASの内容を解説していきたいと思います。

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


【補足】生成AIとのやり取り全文

【補足】生成AIに与えた指示文(プロンプト)

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

#修正したいポイント
 ◆メール本文中にある「月次進捗ファイル\nURL: ********」の箇所を、スプレッドシートからの引用により動的に変化させる。

 ◆氏名、メールアドレス等が記載されたスプレッドシート中のD列に、対象の月次進捗ファイルらのGoogleドライブフォルダIDの記載がある。

 ◆ドライブIDを加工してリンクのURLを生成する。


#現在の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;
}


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;
}

【補足】生成AIからの回答(全文)

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();

  // D列2行目から最終行までのGoogleドライブフォルダIDを取得
  var folderIdRange = sheet.getRange("D2:D" + sheet.getLastRow());
  var folderIdList = folderIdRange.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 folderId = folderIdList[i][0];

    // Googleドライブのリンクを生成
    var fileUrl = `https://drive.google.com/drive/folders/${folderId}`;

    // 本文を設定
    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: ${fileUrl}\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;
}



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

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