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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

Q&A

1回答

2557閲覧

【GAS】同じスプレッドシート内で同じ関数のスクリプトを、対象を変えて複数動かしたい場合はどうすれば良いか

nnkana_rkg

総合スコア1

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

0グッド

1クリップ

投稿2023/06/02 15:31

実現したいこと

  • 同じGoogleスプレッドシート内に、同じ種類のスクリプト(onChangeStatus)を、それぞれ対象範囲を変えて複数設置したいです。

  • 設置したいGASの機能:特定の列のテキストが「完了」に変更されたら、対象のメールアドレスに通知を送りたいです。それを複数用いることで、B列の完了は「納品物の名前が確定しました」、F列の完了は「納品が完了しました」などと通知を使い分けたいです。

前提

Googleスプレッドシートで、GASを使って
特定の列のテキストが「完了」に変更されたら、対象のアドレスにメール通知を送るスクリプトを作りました。
スクリプトが1つの場合は問題なくメールが届きます。

発生している問題・エラーメッセージ

スクリプトを複数立てると、いずれか一つしか作動しません。
トリガーの関数選択のところに

このプロジェクトには同じ名前の関数が複数含まれています。これらのいずれかを選択すると、予期しない動作が発生します。

と表示されます。
※合っているのか分かりませんが、同じ関数、かつ通知が欲しいタイミングは全て「更新してすぐ」なので、トリガーは合わせて1つのみにしています。

該当のソースコード

※記載しているのはF列の「完了」を通知する場合です。
これのif(column === 以下と、メールの内容を変えて複数作成しています。

function onChangeStatus(e){ var cell = e.range; var status = e.value; var sheet = cell.getSheet(); var column = cell.getColumn(); var row = cell.getRow(); var lastRow = sheet.getLastRow(); if(column === 6 && row >= 2 && row <= lastRow && status === 'TRUE'){ sendmail(row);// } } function sendmail(row){ var FIELDS = { no: 1, nouhinname: 3, } var values = SpreadsheetApp.getActiveSheet().getDataRange().getValues(); var index = row - 1; var myNo = values[index][FIELDS.no]; var nouhinname = values[index][FIELDS.nouhinname]; var recipient = '○○@○○.co.jp(指定のメールアドレス)'; var recipientName = '納品完了のお知らせ'; var subject = ''; subject += '納品完了 [' + myNo + '] '+nouhinname+''; var body = ''; body += recipientName + '\n'; body += '以下の納品が完了しました。\n' body += '[' + myNo + '] '+'\n'+ nouhinname +'\n' + ; GmailApp.sendEmail(recipient, subject, body); }

試したこと

  • 複数のスクリプトを並べた場合、リストの1番下のものが作用するようでした。
  • 別の関数を入れているスクリプト(今回挙げているものとは全く別の機能)については問題なく動きます。
  • 同じ関数のものは、同じスクリプトに羅列してみましたが、変わらないため、前に進めない状況です。

非エンジニアのため、解決策がこれ以上わからず、アドバイスいただけますと幸いです。
よろしくお願いいたします。

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YellowGreen

2023/06/02 15:39

function onChangeStatus1(e){ と function onChangeStatus2(e){ のように名前を分けて それぞれにトリガーを設定しないのはなぜですか?
nnkana_rkg

2023/06/02 15:42

ありがとうございます。onChangeStatusには番号がつけられるのですね。 やってみて、メールが来るようになったのですが、OnchangeSatus2を実行してもOnchangeStatus1の通知メールが来ます。連動してどこか変えるべきなのでしょうか。
YellowGreen

2023/06/02 15:43

それができないのであれば、 一つのスクリプトの中で if文で B列の完了のとき メール1送信 F列の完了のとき メール2送信 のようにはできないのでしょうか?
YellowGreen

2023/06/02 15:48

関数名は自分で決めるのですから、 メール送信も function sendmail1() { function sendmail2() { と分けては? ひとつのfunctionで送信を分けることもできますが、今は関数を分ける方が簡単です。
nnkana_rkg

2023/06/02 15:50

やってみたらメールが届くようになりました。関数の名前を自分でカスタムできることを知りませんでした。ありがとうございました。
guest

回答1

0

コメントでご提示したトリガーや関数を複数作成する手法は、具体的なコードを動作確認してから提示することが困難だったのでそのような解決方法をご提示しましたが、同じような関数やトリガーを重複して作成することになってしまいます。
そこで、今回は、重複して同じような関数を作成しないで済む方法の例をご提示します。動作確認が済んでいます。

あまりスマートではありませんが、トリガーも関数も共通して使用できるようにしてみました。
質問と列がずれていますが、シートのB列には品番があると思われるので完了(チェックボックスのチェック)の確認はC列(納品物の名前確定)とF列(納品の完了)にしてあります。
現在は2つのいずれかの列に完了が記される(チェックボックスがチェックされる)とメールを送信しますが、共通変数の中身の{...}の部分を増やすことでそれ以上の列でのメール送信も可能になります。

javascript

1//共通の変数 2const COMMON = [ 3 { 4 column: 6,//F列 5 subject: '納品完了[_NO_]_NAME_', 6 body: '納品完了のお知らせ\n以下の納品が完了しました。\n[_NO_]\n_NAME_\n' 7 }, 8 { 9 column: 3,//C列 10 subject: '納品物の名前確定[_NO_]_NAME_', 11 body: '納品物の名前確定のお知らせ\n以下の納品物の名前が確定しました。\n[_NO_]\n_NAME_\n' 12 }, 13]; 14function onChangeStatus(e) { 15 var cell = e.range; 16 var status = e.value; 17 var sheet = cell.getSheet(); 18 var column = cell.getColumn(); 19 var row = cell.getRow(); 20 var lastRow = sheet.getLastRow(); 21 if (row >= 2 && row <= lastRow && status === 'TRUE') { 22 var items = COMMON.find(c => column == c.column); 23 if (items) { 24 sendmail(row, items); 25 } 26 } 27} 28 29function sendmail(row, item) { 30 var FIELDS = {//配列のインデックスなので列の番号より1少ない 31 no: 1,//B列 32 nouhinname: 3,//D列 33 } 34 var values = SpreadsheetApp.getActiveSheet().getDataRange().getValues(); 35 var index = row - 1; 36 var myNo = values[index][FIELDS.no]; 37 var nouhinname = values[index][FIELDS.nouhinname]; 38 var recipient = '○○@○○.co.jp(指定のメールアドレス)'; 39 var subject = item.subject; 40 subject = subject.replace('_NO_', myNo).replace('_NAME_', nouhinname); 41 var body = item.body; 42 body = body.replace('_NO_', myNo).replace('_NAME_', nouhinname); 43 // console.log(recipient + '\n' + subject + '\n' + body); 44 GmailApp.sendEmail(recipient, subject, body); 45}

投稿2023/06/03 01:58

編集2023/06/04 10:12
YellowGreen

総合スコア731

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YellowGreen

2023/06/03 02:09

COMMONには列番号をそのまま記載しますが、 FIELDSは、getValues()で取得した配列のインデックスなので列番号より1少ない値を記載することになります。
nnkana_rkg

2023/06/04 05:14

返信が遅くなり申し訳ございません。 やってみたら正常に作動しました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問