質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.03%

スプレッドシートでプルダウンで選択された人にメール通知をする

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,259

ran_net

score 11

実現したいこと

プルダウンメニューで項目を複数作成し、プルダウンメニュー内の選ばれた項目ごとに
それぞれの担当者にメールで通知される仕組みを作りたいです。

イメージと仕組み

イメージ説明

簡易的にAさん担当、Bさん担当と書いてますが
実際ここには、それぞれの人が担当する商品名が入ります。

商品の担当が違う人に変更になった際、
元の担当の人が、次に担当になる人をプルダウンメニューから選択します。
すると、次の担当にプルダウンから選ばれた人にメールで通知がいく仕組みです。

変更するたびに全員に通知メールがいくと不便なので
担当者にのみメールを送りたいです。

このような仕様にGASで対応することは可能なのでしょうか、、、?

現在のコード

参考にさせていただきましたが、そもそも仕組みがちがうので
応用できないのでしょうか。。
(参考:https://qiita.com/3mc/items/b78cbb4c2eebf06d26a0)

'use strict';
function sendNotification() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName("シート1");

  const cell = ss.getActiveCell().getB1Notation();
  const columnNameInAlphabet = cell.replace(/\d+/,'');

  //通知対象者と対応するメール通知先を連想配列で格納
  const recipients = { 
    'A': 'aaaaaa@gmail.com',
    'B': 'bbbbbb@gmail.com',
    'C': 'cccccc@gmail.com',
    'D': 'cccccc@gmail.com'
  };
//更新行のC列の値を取得
  const person = sheet.getRange('C'+ sheet.getActiveCell().getRowIndex()).getValue();

  //メールの件名と本文を指定
  const subject = '【更新】'+ss.getName();
  const body = person + 'の行が更新されました。\n' + ss.getUrl() + '\n更新対象は' + columnNameInAlphabet +'列です。';
  //更新された行が通知対象の行を含む場合はメールを送る
  if (person in recipients == true){
    MailApp.sendEmail(recipients[person], subject, body);
  }  
};
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

まえおき

  • 可能ですが、サンプルが悪いです。
  • DをAにして、Aに通知したあと、AもしくはDがBに変更した場合、Bに通知するシナリオであってますか?

本題

イベントオブジェクトを正しく使えば容易です。
シート編集時のトリガーにはイベントオブジェクトが渡されその中に、oldValueとnewValueがありますので

function onEdit(e) {
  Logger.log(JSON.stringify(e);
  if(e.range.getSheet().getName() !== "") { return; } //特定のシート名でなければ中断
  SpreadsheetApp.getActiveSpreadsheet().toast('sheet');
  if(e.range.getColumn() !== 3 ) { return; } //C列でなければ中断
  SpreadsheetApp.getActiveSpreadsheet().toast('column');
  //通知対象者と対応するメール通知先を連想配列で格納
  const recipients = { 
    'A': 'aaaaaa@gmail.com',
    'B': 'bbbbbb@gmail.com',
    'C': 'cccccc@gmail.com',
    'D': 'cccccc@gmail.com'
  };
  //メールの件名と本文を指定
  const subject = '【更新】'+ e.source.getName();
  const body = e.oldValue + 'さんから' + e.value + 'さんに担当が変更されました。\n' + e.source.getUrl() + '\n更新対象は' + e.range.getRow() + '行C列です。';

  MailApp.sendEmail(recipients[e.value], subject, body);
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/12/21 20:47

    トリガーは編集時ですね?
    スクリプト上で実行とは?関数の実行でしょうか?

    なぜランちゃんやめたのでしょうか?気もそぞろなんですが。

    キャンセル

  • 2018/12/21 21:14

    あ!!すみません。。そうでした。
    編集時と変更時を勘違いしていました!;;
    お騒がせしてすみません。

    自分の好きなキャラクターの画像を見つけたので変えてみました。
    が、名前と画像が一致しないのでランちゃんに戻そうと思いますm(._.)m

    キャンセル

  • 2018/12/22 12:04

    そうは言ったものの、らんちゃんはここのユーザ層とは合わないので、参考程度に。

    あ、できてよかったです。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.03%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる