見出し画像

[GAS]スプレッドシートが編集された時にトリガーでメール通知(自分に編集権限がないスプシの場合)

自分に編集権限がないスプレッドシートの場合、コンテナバインドのGASのコードでトリガーを設定することはできなさそうです。

そんな時も、以下のようなスタンドアロン(もしくは自分が編集できるスプレッドシートのコンテナバインド)でインストーラブルトリガーを設定するGASを書けば、特定のスプレッドシートが編集された時にメール通知を受け取ることができそうです。(大雑把にいうと、シンプルトリガーは基本コンテナバインド、インストーラブルトリガーはそうでなくてもOKなイメージ)

スプレッドシートに備え付けの「ツール」の「通知機能」で解決できない課題の場合に。

注意事項

  • 対象のスプレッドシートの閲覧権限以上を持っている必要があります。

  • 対象のスプレッドシートのIDを知っている必要があります。(閲覧できていれば、そのURLの一部がスプレッドシートIDです)

  • e.rangeを使えば、指定したセルが変更された場合のみ通知する仕様にできそうです。

  • 下記はサンプルとして、基本の枠組みだけシンプルに書いています。このままだと、1セル編集されるごとにメールが来ますw なので、前の項目のように、e.rangeを使用して通知対象範囲を限定するか、編集権限をもらってコンテナバインドでGASを書き、ひととおりスプシの編集が終わった時点でボタンを押して通知してもらうフローにするなど、別の仕組みを検討してもいいかもしれません。

手順

https://script.google.com/home を開く

②「新しいプロジェクト」をクリック

③GASのエディタに以下のコードをコピペ

④コード内の★1~★3に自分のデータを入力(できる方はプロパティストアを活用)

★1と★2のスプレッドシートIDは、対象スプレッドシートのURLが
https://docs.google.com/spreadsheets/d/******/edit~~~だとすると
「******」の部分です。

⑤エディタで「setEditTrigger」関数を実行(これでトリガーがセットされる)

コード


/**
 * 対象スプレッドシートに対して編集時トリガーを設定する関数
 * NOTE:対象スプシのコンテナバインドでコードを書けない場合を想定した、スタンドアロンで動くコード
 * NOTE:対象スプレッドシートのスプレッドシートIDを知っていることが前提
 * NOTE:対象スプレッドシートに対して少なくとも閲覧権限を持っていることが前提
 */
function setEditTrigger() {

  const ssId = "対象スプレッドシートのスプレッドシートIDを入力"; //★1

  ScriptApp.newTrigger("sendEmailNotification")
    .forSpreadsheet(ssId)
    .onEdit()
    .create();

}

/**
 * 編集時トリガーで発火し、recipientEmailにメールを送る関数
 * NOTE:スプシが閲覧/コメントモードで開かれた場合は起動しない
 */
function sendEmailNotification(e) {

  // if (recipientEmail === editorEmail) return; // 自分が編集した場合は通知が飛ばないようにするガード節。コメント解除すれば機能する
  const ssId = "対象スプレッドシートのスプレッドシートIDを入力"; //★2
  const recipientEmail = "宛先のemailアドレスを入力"; //★3

  const ssName = e.source.getName();  // 対象スプシの名前を取得(スプシ名が通知不要なら、この1行は不要)
  const editorEmail = e.user.getEmail();  // 編集者のemailアドレスを取得(メールにこの情報が不要なら、この1行は不要)
  // const editedRange = e.range.getA1Notation(); // 変更セルを取得。必要ならコメント解除してください(メールに表示させる場合はbodyの右辺に${editedRange}を入れ込む)
  // const oldValue = e.oldValue; // 編集前の値を取得(単一セルの場合)必要ならコメント解除してください(メールに表示させる場合はbodyの右辺に${oldValue}を入れ込む)

  const subject = `[自動通知] スプレッドシート 「${ssName}」 が編集されました`;
  const body = `こちらのスプレッドシートが編集されました:${ssName}\\n編集者はこちらの方です: ${editorEmail}\\n編集されたスプレッドシートのスプレッドシートIDはこちらです:${ssId}`;

  GmailApp.sendEmail(recipientEmail, subject, body);

}

なお、自分の欲しい機能を追加したりして試験を重ね終わったら、
// if (recipientEmail === editorEmail) return; の行をコメント解除すると
自分が編集した場合にはメールが来ないようにすることもできます。(今回は、コンテナバインドできない状況を想定しているので、自分が編集するという状態はなく、この行は不要かもしれませんが、、、)


この記事が気に入ったらサポートをしてみませんか?