Posted at

Googleスプレッドシートの特定行に更新があった場合に、特定の人に通知する。

More than 1 year has passed since last update.


やりたいこと

Googleスプレッドシートでシフト管理がされていて、管理者が更新しています。

管理者がシフトに「○」をつけた際(何らかの更新があった場合)に、該当の人にメールで通知が飛ぶようにしたいと思います。

下記はスプレッドシートのイメージです。

A
B
C
D
E

1
名前
1月1日
1月2日
1月3日
1月4日

2
宛先 一男

3
宛先 二郎

4
以下略

スプレッドシートには、更新があった場合に通知をする機能がありますが、対象範囲を指定することができないようなので、Google Apps Scriptで実現したいと思います。


完成したコード


Code.gs

'use strict';

function sendNotification() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName("シートの名前");
const cell = ss.getActiveCell().getA1Notation();
const columnNameInAlphabet = cell.replace(/\d+/,'');
//通知対象者と対応するメール通知先を連想配列で格納
const recipients = {
'宛先 一男': 'xxxx@gmail.com',
'宛先 二郎': 'yyyy@gmail.com'
};
//更新行のA列の値を取得(名前が入っているはず)
const person = sheet.getRange('A'+ 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);
}
};


コードの説明


Code.gs

'use strict';

function sendNotification() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName("シートの名前");

対象のスプレッドシートと更新対象のシートを指定します。


Code.gs

  const cell = ss.getActiveCell().getA1Notation();

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

更新された列をメール本文に含めたいので、getA1Notationでアクティブなセルの位置を取得します。取得したセル位置に含まれる数字をreplaceで空文字に置換して、列名のみにします。

※運用上、作業時に行を入れ替えて更新するので、列番号で記載するようにしています。普通はgetA1Notationで取得したセルの位置をそのまま記載してあげれば良いと思います。


Code.gs

//通知対象者と対応するメール通知先を連想配列で格納

const recipients = {
'宛先 一男': 'xxxx@gmail.com',
'宛先 二郎': 'yyyy@gmail.com'
};
//更新行のA列の値を取得(名前が入っているはず)
const person = sheet.getRange('A'+ sheet.getActiveCell().getRowIndex()).getValue();

メールアドレスの情報はスプレッドシートにないので、ここで連想配列として紐付けをします。

そして、更新行の名前が入っている列(今回はA列)の値を取得します。

この二つは後ほど突合するため、表記が一致している必要があります。(姓名の間にあるスペースなど)


Code.gs

//メールの件名と本文を指定

const subject = '【更新】'+ss.getName();
const body = person + 'の行が更新されました。\n' + ss.getUrl() + '\n更新対象は' + columnNameInAlphabet +'列です。';

メールの件名は、スプレッドシートの名前先頭に【更新】を付与することにしました。

メール本文には、スプレッドシートのURLと更新された列名を記載します。


Code.gs

//更新された行が通知対象の行を含む場合はメールを送る

if (person in recipients == true){
MailApp.sendEmail(recipients[person], subject, body);
}
};

更新された行のA列に書いてある名前(person)と、メール配信先の配列(recipients)のキーを突合して、一致する場合はメールを送信します。


スプレッドシートのトリガーを設定

該当のスプレッドシートで「スプレッドシートから」「値の変更」時に起動するようトリガーを設定してください。