【生成AI×GAS】GmailにGoogleDriveフォルダのリンクを挿入
オレンジピーチのトシです。
生成AIを用いて「GASでメールを書く」スクリプトを作成する方法を紹介しています。
ここでは、一旦出来上がったGAS(Google Apps Script)のコードを修正して、より業務の効率化につながる形に改良を進めています。
今回は、Gmailの本文中にGoogleドライブのリンクを挿入する方法を紹介したいと思います。
GAS初心者の人、プログラム初心者の人でも、生成AIを活用して、GASのスクリプトを改良していく方法を知って頂ければHappyです。
今回の完成イメージ:やりたいこと
今回は、過去の記事で紹介した、「営業日を逆算して締切期日設定」スクリプトを修正して、本文中のGoogleドライブフォルダへのリンクを動的に変化させたいと思います。
過去の記事については、こちらからご覧ください。
振り返り
①スプレッドシートのリストに記載のあるメールアドレスに対して、順にメールを送る。
②送付したいメール内容は下記の通り。
今回のポイントは、本文中の月次進捗ファイルのURL(太字)です。
修正したい内容を明確にする
修正したい箇所は、月次進捗表のURLリンクの箇所です。
このURLをどのように設定したいのかを明確にします。
今回は、今後も月次進捗表が追加されることを想定し、Googleドライブ中に担当者毎のフォルダを作成して、そのフォルダへのリンクを表示するように修正していきます。
修正のゴールイメージが定まったので、実際にコードを修正していきます。
Googleドライブフォルダの準備とスプレッドシートの修正
まず、Googleドライブ中に、月次進捗表のフォルダを担当者の数だけ準備します。
Googleドライブであれば、場所はどこでも構いません。
フォルダIDをスプレッドシートに追記する
作成したGoogleドライブのフォルダのIDを取得します。
Googleドライブでは、フォルダやファイルが作成されると、それを一意に決めるIDが付与されます。(新規作成もしくは、アップロードされた時点で付与される)
フォルダIDは、各フォルダのURLから確認できます。
https://drive.google.com/drive/folders/ の後ろの部分がフォルダIDです。
担当者毎に作成したフォルダの「フォルダID」をスプレッドシートに追記します。
これでスプレッドシートの準備が出来ました。
生成AIを用いたGASの修正
次にGASの修正を行います。
今回は、生成AIとして、Microsoft Copilot を使用しました。
生成AIに指示を出す。
生成AI(Copilot)には、修正したいポイントを箇条書きで書いた上で、現在のGASコードを貼り付けて指示を出しました。
(文章が長文になるため、全文のプロンプトはこの記事の最後に【補足】として載せています。)
生成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;
}