見出し画像

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

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


作成したGAS等のおさらい

作成したGASのおさらい

前回の記事で作成した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();

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


作成したGoogleDriveフォルダのおさらい

Googleドライブのフォルダを新たに作成しました。
フォルダは担当者の数だけ作成しています。

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

修正したスプレッドシートのおさらい

前回の記事ではスプレッドシートも修正しました。
スプレッドシートのD列に、フォルダIDを追加しています。

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

GASの内容解説①

スクリプトの修正内容を、詳しく説明していきます。
(修正が行われたポイントに絞って解説を行います。)

GoogleドライブフォルダIDを取得

新たに追加したD列のデータを取得する部分です。
内容は、A列、B列、C列のデータ取得の方法と同じで、D列の2行目から最終行までの範囲を指定して、範囲内のデータを取得して変数に格納します。

// D列2行目から最終行までのGoogleドライブフォルダIDを取得
var folderIdRange = sheet.getRange("D2:D" + sheet.getLastRow());
var folderIdList = folderIdRange.getValues();

各メールアドレスに対応したfolderIdを取得

for文を用いて1行毎(各メールアドレス毎)に「宛先」、「氏名」、「部署」を取得する部分に、「フォルダID (folderId)」の変数を加えています。

// 各メールアドレスにメールを送信
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ドライブのURLを作成

先に取得した、フォルダID(変数 folderId)から、そのフォルダのURLを作成します。
フォルダIDの前に、文字列で「https://drive.google.com/drive/folders/」を加えることで、GoogleDriveフォルダのリンクを作成します。

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

本文中にフォルダのURLを引用する

バックテック(` )を利用したテンプレート文字列により、本文中に「関数 fileUrl」を埋め込む。

// 本文を設定
・・・・
body += `${department}部 ${name} 月次進捗ファイル\nURL: ${fileUrl}\n`;
・・・・

まとめ

今回は、生成AIで修正したGASの内容を解説しました。
修正した内容は、スプレッドシートの指定の範囲から値を取得したり、文字列を加工したりと、これまで既に解説してきたメソッドばかりでした。

このように、少しづづGASの仕組みが理解出来てくると、生成AIが作成したスクリプトの内容を、読み解くことが出来ると思います。

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


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