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

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回答

2138閲覧

GASで特定の列に更新があると自動で通知メールが飛ぶようにしたいが、rangeが定義されていないとエラーが出る

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/05/29 03:15

編集2023/05/29 05:43

実現したいこと

  • プロジェクトに必要な納品物の管理をしており、Googleスプレッドシートで特定の列が"完了"に更新された際に指定のアドレスにメールが飛ぶようにしたい
  • 更新通知のメールの内容を指定したい

前提

実行する関数:onChangeStatus
デプロイ時に実行:Head
イベントのソースを選択:スプレッドシートから
イベントの種類を選択:編集時
エラー通知設定:今すぐメールを受け取る

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

  • スクリプトエディタ内で実行すると下記エラーが出ます。
TypeError: Cannot read properties of undefined (reading 'range') onChangeStatus @ コード.gs:2
  • 実際にスプレッドシートで"完了"を入力し、実行ログを見ると、「種類:トリガー」で「完了」と出ていますが、メールは届きません。

該当のソースコード

H列を"完了"に変えると、指定のメールアドレスにB列のナンバー、F列の納品物の名前とともに完了通知を送りたいです。

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 === 8 && row >= 2 && row <= lastRow && status === '完了'){ sendmail(row); } } function sendmail(row){ var FIELDS = { no: 1, nouhinname: 5, } 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.sendmail(recipient, subject, body); }

試したこと

色々と検索しているとこちらの質問の回答を見つけました。
スクリプトエディタ内の実行であればエラーでも大丈夫なのかと思いましたが、実際にセルを「完了」に更新してもメールは届かず、前に進めない状況です。https://teratail.com/questions/313931

対処法をご教示いただけますと幸いです。

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

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

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

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

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

YellowGreen

2023/05/29 03:24

if(column === 7 && row >= 2 && row <= lastRow && status === '完了'){ とありますが、H列(第8列)が編集されたときにメールを送信したいのであれば、 if(column === 8 && row >= 2 && row <= lastRow && status === '完了'){ ではないでしょうか?
YellowGreen

2023/05/29 03:30 編集

なお、エディタから実行するとエラーになるのはお見込みのとおり、 シートの編集イベントが無いので e に値が渡されておらず、 e.rangeから値を取得できないためですので気にする必要はありません。 エラーにならないようにしたいのであれば、 関数内の一番最初に if (e === undefined) { console.log('このスクリプトはエディタからは実行できません。'); return; } の4行を挿入しておきます。
nnkana_rkg

2023/05/29 03:30

失礼しました。「8」でした。 修正しましたが、同じようにエラーが出るかつメール通知は届きません。 他に原因があるということでしょうか。
guest

回答1

0

ベストアンサー

関数名や変数名の修正が必要です。

JavaScript

1 if(column === 7 && row >= 2 && row <= lastRow && status === '完了'){ 2 sendEmail(row);

のところは7を8にするほか、

JavaScrIpt

1 if(column === 8 && row >= 2 && row <= lastRow && status === '完了'){ 2 sendmail(row);//←関数名に合わせる

それから件名の

JavaScript

1 subject += 'タスク完了 [' + no + '] '+nouhinname+'';

のところはnoをmyNoにして

JavaScript

1 subject += 'タスク完了 [' + myNo + '] '+nouhinname+'';

ですし、本文の方も

JavaScript

1 body += '[' + myNo + '] '+'\n'+ nouhinname +'\n';

も同じです。

以上で、メールが届くようになりますが、

JavaScript

1 subject += 'タスク完了 [' + myNo + '] '+nouhinname+''; 2 subject += nouhinname;

のままだとnouhinnameが重複して件名に表示されてしまいます。
subject += 'タスク完了 [' + myNo + '] '+nouhinname+'';のところは
「+ nouhinname +」ではなく「+ '品名:' +」等にするのではないかと思います。

投稿2023/05/29 03:54

編集2023/05/29 03:56
YellowGreen

総合スコア731

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

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

nnkana_rkg

2023/05/29 05:44

詳しくありがとうございます。 いただいた内容に沿って修正してみましたが、実行ログにはトリガーの「完了」が表示されるもののメールが届きません。 何か権限などの問題でしょうか。
YellowGreen

2023/05/29 05:48 編集

GmailApp.sendmail(recipient, subject, body); は、元のままsendEmailにしてください。 これは 関数名でなく、メソッド名なので。 私がご提示した部分だけを修正して、あとは変更なしです。
nnkana_rkg

2023/05/29 06:23

修正したらメール届きました!! 詳しく教えていただき、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問