今回は、GoogleAppsScript(GAS)を用いてスプレッドシートで作成したタスク表とGmailを連携して完了したタスクの報告メールを自動的に送信してくれるツールの作り方をお伝えしていきます。
初めてGASでプログラミングを行う方でもわかりやすいように、ステップごとに手順をまとめてご紹介します。
サンプルコードも提供しますので、誰でも今日から利用できます。本記事を最後まで読んで、タスク管理やメール作成の時短に活用してください。
報告メールの手間をGASで一気に解決!自動化で効率UP
報告メールは、日々の作業の中でも意外と面倒な作業です。送信を忘れて怒られた経験がある方もいるかもしれません。また、タスク管理表を利用している場合、タスク表に完了を記載してからメールを送るという管理が煩雑になりがちです。
そこで、GASを使ってスプレッドシートとGmailを連携させ、タスク管理と報告メールの送信を同時に行ってしまいましょう!
この方法を行うメリットは、主に以下の3点です。
GASとスプレッドシートを組み合わせることで、手動の報告作業を自動化し、業務効率を上げながらヒューマンエラーを減少させることが期待できます。
報告メール送信スクリプトの仕様
今回は、以下のような機能を持つ報告メール送信スクリプトを作成していきます。
- タスク管理用のスプレッドシートにてタスク完了の登録をすると起動
- 完了したタスクの内容を読み取り報告メールを送信
- 送信したタスクは、報告ステータス列に「報告済」と表示
- 報告メールは、以下の定型文で送信
以下タスクが完了しました。
【完了タスク】
タスク名:<タスク管理表上のタスク名>
タスク詳細:<タスク管理表上のタスク詳細>
期限:<タスク管理表上の期限>以上、確認お願いします。
事前準備:タスク管理用のスプレッドシートを作成
まずは、タスク管理用のスプレッドシートを作成します。
- Googleドライブにアクセスします。
ウェブブラウザからGoogleドライブにアクセスして、「ドライブを開く」をクリックします。
Googleアカウントにログインしていない場合は、ログインページにアクセスしてから次のステップに進んでください。
新規ボタンをクリックし、スプレッドシートを作成します。
列名とファイル名を設定します。列名として1行目に以下を入力します。
- ステータス
- タスク名
- タスク内容
- 期限
- 報告ステータス
ファイル名は「タスク管理用スプレッドシート」とします。
そのままコピペできる列目はこちら。
ステータス | タスク名 | タスク内容 | 期限 | 報告ステータス |
GASで日報送信スクリプトを作成しよう
いよいよGoogleAppsScriptを記述していきます。
先程作成したGoogleスプレッドシートにて拡張機能-AppsScriptをクリックします。
AppScript画面に切り替わります。
まずは、簡単にAppsScript画面についてご説明します。
手始めにプロジェクト名を変更してみましょう。
今回は、メール送信スクリプトなので「CompTaskSendMail
」に変更しましょう。
続いてプログラムを記述していきます。
今回作成するプログラムの完成形は以下になります。
【注意】メール設定のミスを防ぐため、テスト時には必ず宛先の確認を行い、誤送信を避けましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
function CompTaskSendMail() { //******************************** // 処理に必要な設定情報 //******************************** // メール送信先情報 let subject = "タスク完了報告"; // 件名 let senduser = "your-email@example.com"; // 送信元メールアドレス let senderName = "送信元ユーザー"; // 送信元名 let to = "recipient-email@example.com"; // 送信先メールアドレス let toname = "宛先部長"; // 送信先名 let cc = ""; // CCメールアドレス let bcc = ""; // BCCメールアドレス let reply = senduser; // 返信宛先名 // メール本文情報 let taskName = ""; // タスク名 let taskDetail = ""; // タスク内容 let limitDate = ""; // 期限 let headerBody = 'お疲れ様です。 \n\n 以下タスクが完了しました。 \n\n 【完了タスク】\n'; // 本文ヘッダー let footerBody = '以上、確認お願いします。'; // 本文フッダー let body = ''; // 本文 // スプレッドシート取得列番号 let taskStatusCol = 1; // ステータス列番号 let taskNameCol = 2; // タスク名列番号 let taskDetailCol = 3; // タスク内容列番号 let limitDateCol = 4; // 期限列番号 let sendStatusCol = 5; // 送信済ステータス列番号 // スプレッドシート取得情報 let sheet = SpreadsheetApp.getActiveSheet(); //シートを取得 let last_row = sheet.getLastRow(); // 最終行を取得 //******************************** // 完了タスク取得処理 //******************************** for (let i = 1; i <= last_row; i++) { let taskStatus = sheet.getRange(i, taskStatusCol).getDisplayValue(); let sendStatus = sheet.getRange(i, sendStatusCol).getDisplayValue(); if (taskStatus == "完了" && sendStatus != "送信済") { taskName = sheet.getRange(i, taskNameCol).getDisplayValue(); // タスク名取得 taskDetail = sheet.getRange(i, taskDetailCol).getDisplayValue(); // タスク詳細取得 limitDate = sheet.getRange(i, limitDateCol).getDisplayValue(); // タスク期限取得 //******************************** // メール送信処理 //******************************** var options = { name: senderName }; if (cc) options.cc = cc; if (bcc) options.bcc = bcc; if (reply) options.replyTo = reply; // メール本文作成 body = headerBody; body += 'タスク名:' + taskName + '\n'; body += 'タスク詳細:' + taskDetail + '\n'; body += '期限:' + limitDate + '\n\n'; body += footerBody; // メール送信 if (to) { GmailApp.sendEmail(to, subject, body, options); } // スプレッドシートの報告ステータスに「送信済」を入力 sheet.getRange(i, sendStatusCol).setValue("送信済"); } } } |
仕組みはどうでもいいのですぐに動かしたいという方はこちらをコピー&ペーストして動作確認の項に進んでいただければOKです。
内容も理解したいという方のためにスクリプト作成の手順を説明していきます。
メイン関数を作成
最初に関数を作成します。
関数とは、1つの目的のため複数の処理を1つにまとめて記述したものです。
GASではこの関数を呼び出して処理を実行します。
今回は、CompTaskSendMail
という名前のファンクションを作成します。
エディタエリアに以下のように記述します。
1 2 3 4 |
function CompTaskSendMail() { } |
設定情報を記述
スプレッドシートの情報など設定情報を記述します。
以下のように記述します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
//******************************** // 処理に必要な設定情報 //******************************** // メール送信先情報 let subject = "タスク完了報告"; // 件名 let senduser = "your-email@example.com"; // 送信元メールアドレス let senderName = "送信元ユーザー"; // 送信元名 let to = "recipient-email@example.com"; // 送信先メールアドレス let toname = "宛先部長"; // 送信先名 let cc = ""; // CCメールアドレス let bcc = ""; // BCCメールアドレス let reply = senduser; // 返信宛先名 // メール本文情報 let taskName = ""; // タスク名 let taskDetail = ""; // タスク内容 let limitDate = ""; // 期限 let headerBody = 'お疲れ様です。 \n\n 以下タスクが完了しました。 \n\n 【完了タスク】\n'; // 本文ヘッダー let footerBody = '以上、確認お願いします。'; // 本文フッダー let body = ''; // 本文 // スプレッドシート取得列番号 let taskStatusCol = 1; // ステータス列番号 let taskNameCol = 2; // タスク名列番号 let taskDetailCol = 3; // タスク内容列番号 let limitDateCol = 4; // 期限列番号 let sendStatusCol = 5; // 送信済ステータス列番号 |
メールの送信に必要な情報を取得するための情報を設定しています。
メール文章の文頭と文末は、定型文とするのでそれぞれheaderBody 、footerBody に定型文を格納しています。
スプレッドシートのタスク情報を取得
設定情報の記述ができましたらスプレッドシートから情報を取得する処理を記載します。
スプレッドシートのタスク情報取得処理は、以下のように記述します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
// スプレッドシート取得情報 let sheet = SpreadsheetApp.getActiveSheet(); //シートを取得 let last_row = sheet.getLastRow(); // 最終行を取得 //******************************** // 完了タスク取得処理 //******************************** for (let i = 1; i <= last_row; i++) { let taskStatus = sheet.getRange(i, taskStatusCol).getDisplayValue(); let sendStatus = sheet.getRange(i, sendStatusCol).getDisplayValue(); if (taskStatus == "完了" && sendStatus != "送信済") { taskName = sheet.getRange(i, taskNameCol).getDisplayValue(); // タスク名取得 taskDetail = sheet.getRange(i, taskDetailCol).getDisplayValue(); // タスク詳細取得 limitDate = sheet.getRange(i, limitDateCol).getDisplayValue(); // タスク期限取得 |
この処理では、スプレッドシートのタスク情報を1行づつ取得し完了タスクかを確認します。
繰り返し処理は、for()関数を利用します。
1 2 3 4 5 6 7 8 9 10 |
// for ループの基本的な構文 for (初期化; 条件式; 増減式) { // ループ内で実行されるコード } // 例: 1 から 5 までの数字をコンソールに出力する for (var i = 1; i <= 5; i++) { Logger.log(i); } |
この例では、変数 i
が初期値 1
から始まり、5
以下の条件を満たす限り、1
ずつ増加するという基本的な for
ループがあります。各ループの実行時には、コンソールに i
の値が表示されます。
スプレッドシートのセルの値取得は、getRange().getDisplayValue()を利用します。
主な使い方は、以下。
1 2 3 |
// A列の1行のセルの値を取得 var range = sheet.getRange(1, 1).getDisplayValue(); // 開始セル(1,1)から3行1列分 |
取得した情報は、前述の設定情報で作成した各項目の格納用変数に格納します。
取得後は、判定関数であるif関数を用いて1列目のステータスが「完了」かつ5列目の報告ステータスが空白であるかをチェックします。
メールの送信処理
最後に完了したタスクを報告するメールを作成して送信します。
以下の内容をforの中括弧の中に記述してみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
//******************************** // メール送信処理 //******************************** var options = { name: senderName }; if (cc) options.cc = cc; if (bcc) options.bcc = bcc; if (reply) options.replyTo = reply; // メール本文作成 body = headerBody; body += 'タスク名:' + taskName + '\n'; body += 'タスク詳細:' + taskDetail + '\n'; body += '期限:' + limitDate + '\n\n'; body += footerBody; // メール送信 if (to) { GmailApp.sendEmail(to, subject, body, options); } |
テスト用の実行したときに、
トリガー設定
作成したスクリプトをスプレッドシートの編集が発生した際に自動的に実行されるようにトリガーの設定をします。
AppScript画面にて以下の操作を行います。
トリガーボタンをクリック。
トリガーを追加をクリック
以下の設定でトリガーを設定して保存をクリック。
実行する関数を選択:RegisterSchedule
実行するデプロイを選択:Head
イベントのソースを選択:スプレッドシートから
イベントの種類を選択:編集時
一覧に設定したトリガーが表示されればトリガー設定完了です。
新着メールを受信して翌日に自動的にスプレッドシートに転記されていれば成功です。
動作確認
スクリプトが完成したので実際に動かして見ましょう。
メールが送信されるため、メールアドレスの設定には十分に注意しましょう。
タスク登録用スプレッドシートにタスクを記入します。
リマインドメールが送られれば成功です。
上手くメールが送信されない・・・そんなときはココをチェック
GASでメール送信が上手くいかない場合、スプレッドシートのデータやスクリプトに問題があることがあります。
サンプルデータを使用して、設定が正しいか確認してみましょう。
スプレッドシートのサンプルデータ
ステータス | タスク名 | タスク内容 | 期限 | 報告ステータス |
---|---|---|---|---|
完了 | 月次レポート作成 | 8月分の月次レポートを作成 | 2023/09/10 | |
未完了 | 会議資料準備 | 次週の会議資料を準備 | 2023/09/15 | |
完了 | 顧客対応 | 顧客からの問い合わせ対応 | 2023/09/08 | 送信済 |
完了 | チームミーティング | チーム会議を設定する | 2023/09/12 |
各列の意味
- ステータス: タスクの進捗状況(完了/未完了など)
- タスク名: タスクの名前
- タスク内容: タスクの詳細
- 期限: タスクの締め切り日
- 報告ステータス: 報告メールの送信状況(空欄が未送信、”送信済”が送信完了)
このサンプルデータを使って、スクリプトが「ステータス」が「完了」かつ「報告ステータス」が空のタスクについて、自動で報告メールを送信し、「送信済」と記録されることを確認できます。
例として
- 「月次レポート作成」や「チームミーティング」が完了していて、報告ステータスが空欄であれば、これらが対象のタスクとなり、メールが送信されます。
- 「顧客対応」は既に報告ステータスが「送信済」なので、メール送信は行われません。
まとめ
今回は、GASを利用してスプレッドシートで作成したタスク表から自動的に報告メールを送信するツールについてご紹介しました。
本記事の内容をまとめと以下。
日々の業務で発生する報告メールや日報メールの作成は手間のかかる作業。
ですがGASを活用すれば、その手間を削減しながら業務の効率化が可能です。
今回の記事を参考にGASを使った業務効率化を図ってみてください。