パソコン用ヘッダー画像
Googleサービス PR

【GAS】チェックボックスで完了通知メール自動送信

チェックボックスをトリガーに自動通知スクリプト
記事内に商品プロモーションを含む場合があります

日々の業務で発生する、進捗管理やタスク完了の報告。手作業で行っていませんか?

Google Apps Script(GAS)を使えば、スプレッドシートのチェックボックス操作だけで、完了通知メールを自動送信できます。

この記事では、GAS メール送信、GAS スプレッドシート連携の具体的な活用事例、そしてGASで実現できるその他の業務効率化について解説します。

GAS活用事例:チェックボックス一つで完了通知

チェックボックスを活用した業務時短術

GASを活用した業務効率化の具体例として、スプレッドシートのチェックボックス操作で完了通知メールを自動送信する方法を紹介します。GAS メール送信とGAS スプレッドシート連携の連携により、手作業を削減し、業務効率を向上させます。

スプレッドシートと連携した自動化

例えば、タスク管理にスプレッドシートを使用しているとします。GASを使えば、特定の列のチェックボックスがオンになった際に、完了通知メールを自動送信できます【GAS メール送信】。

function onEdit(e) {
  if (!e) {
    // 手動実行を防止
    return;
  }

  const sheet = e.source.getActiveSheet();
  const sheetName = "*********"; // 対象シート名

  // シート名が「*********」であることを確認
  if (sheet.getName() !== sheetName) {
    return; // 対象シートでなければ終了
  }

  const range = e.range;
  const checkBoxColumn = 1; // A列(1列目)
  const emailColumn = 4; // D列(4列目)

  // 編集されたのがA列かどうかをチェック
  if (range.getColumn() === checkBoxColumn) {
    const row = range.getRow();
    const newValue = range.getValue();
    const oldValue = e.oldValue;

    // チェックボックスに新たにチェックが入ったかどうかを確認
    if (newValue === true && oldValue !== true) {
      const email = sheet.getRange(row, emailColumn).getValue();

      const subject = "完了通知";
      const body = "お疲れ様です。○○営業部の○○です。\nアカウント設定が完了しました。\nよろしくお願いします。";

      if (email && isValidEmail(email)) {
        MailApp.sendEmail(email, subject, body);
      } else {
        // ポップアップを表示するためのカスタム関数を実行
        const ui = SpreadsheetApp.getUi();
        ui.alert(`Row ${row} には有効なメールアドレスがありません`);
      }
    }
  }
}

function isValidEmail(email) {
  // 正規表現を使用してメールアドレスの形式を検証する
  const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
  return emailRegex.test(email);
}

スクリプトの仕組み

上記のスクリプトは、スプレッドシートが編集された際に実行されます(onEditトリガー)。編集されたセルがチェックボックスの列で、かつチェックボックスがオンになった場合、指定された列からメールアドレスを取得し、完了通知メールを送信します。

【応用編】チェックボックスで完了通知メール自動送信

さらに工夫して業務効率化

GASを使った完了通知メール自動送信の応用編として、すでにチェックが入っているデータは実行させない、メールアドレスが有効かどうかのチェック、他のカラムのデータをメール本文に加える方法を紹介します。

既にチェックが入っているデータは実行させない

e.oldValue を使って、編集前の値がtrue(チェック済み)でなければメール送信するようにします。

function onEdit(e) {
  // ... (前のコードと同じ)


 // 編集されたのがA列かどうかをチェック
   if (range.getColumn() === checkBoxColumn) {
    const row = range.getRow();
    const newValue = range.getValue();
    const oldValue = e.oldValue;


 // チェックボックスに新たにチェックが入ったかどうかを確認
    if (newValue === true && oldValue !== true) {
      const email = sheet.getRange(row, emailColumn).getValue();

      const subject = "完了通知";
      const body = "お疲れ様です。○○営業部の○○です。\nアカウント設定が完了しました。\nよろしくお願いします。";

    }

メールアドレスが有効かどうかのチェック

isValidEmail 関数でメールアドレスの形式をチェックし、有効な場合のみメールを送信します。無効な場合は、SpreadsheetApp.getUi().alert() を使ってポップアップでエラーメッセージを表示します。

function onEdit(e) {
  // ... (前のコードと同じ)


if (notifyEmail && isValidEmail(notifyEmail) && targetEmail && isValidEmail(targetEmail)) {
        MailApp.sendEmail(notifyEmail, subject, body);
      } else {
        const ui = SpreadsheetApp.getUi();
        ui.alert(`Row ${row} には有効なメールアドレスがありません`);
      }
    }
  }
}

/**
 * メールアドレスの形式を検証する関数
 */
function isValidEmail(email) {
  const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
  return emailRegex.test(email);
}

他のカラムのデータをメール本文に加える

「~完了しました。」だけだと通知メールとはいえ、どこか味気ない内容になります。他の列から取得したデータ(例:期限)をメール本文に含めることができます。

function onEdit(e) {
  // ... (前のコードと同じ)

  const dueDate = sheet.getRange(row, 3).getValue(); // 期限の列を指定
  const body = `タスク「${taskName}」(期限:${dueDate})が完了しました。`;

  // ... (メール送信処理)
}

その他の業務効率化事例

GASを習得すると可能性が広がる

GASはメール送信やスプレッドシート連携以外にも、様々な業務効率化に活用できます。Google Workspaceの他のサービスとの連携や、外部APIとの連携など、GASの可能性は無限大です。

今回の記事以外でも以下のような連携機能について紹介していきたいと思います。

Googleカレンダーとの連携

GASを使って、Googleカレンダーの予定を自動的に管理することも可能です。例えば、特定のキーワードを含む予定を抽出してスプレッドシートにまとめたり、予定のリマインダーメールを自動送信したりできます。

外部APIとの連携

GASは外部APIとの連携も可能です。例えば、天気予報APIと連携して、毎朝その日の天気をメールで通知したり、翻訳APIと連携して、スプレッドシートのデータを自動翻訳したりできます。


Fatal error: Uncaught JSMin_UnterminatedRegExpException: JSMin: Unterminated RegExp at byte 47225: /.source + in /home/c1448553/public_html/one-walker.net/wp-content/plugins/autoptimize/classes/external/php/jsmin.php:264 Stack trace: #0 /home/c1448553/public_html/one-walker.net/wp-content/plugins/autoptimize/classes/external/php/jsmin.php(150): JSMin->action(1) #1 /home/c1448553/public_html/one-walker.net/wp-content/plugins/autoptimize/classes/external/php/jsmin.php(84): JSMin->min() #2 /home/c1448553/public_html/one-walker.net/wp-content/plugins/autoptimize/classes/autoptimizeSpeedupper.php(38): JSMin::minify('/* PrismJS 1.29...') #3 /home/c1448553/public_html/one-walker.net/wp-includes/class-wp-hook.php(324): autoptimizeSpeedupper->js_snippetcacher('/* PrismJS 1.29...', '/home/c1448553/...') #4 /home/c1448553/public_html/one-walker.net/wp-includes/plugin.php(205): WP_Hook->apply_filters('/* PrismJS 1.29...', Array) #5 /home/c1448553/public_html/one-walker.net/wp-content/plugins/autoptimize/classes/autoptimizeScripts.ph in /home/c1448553/public_html/one-walker.net/wp-content/plugins/autoptimize/classes/external/php/jsmin.php on line 264