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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Google Apps Script

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

Q&A

解決済

2回答

539閲覧

ifやforEachの中で取得した変数の値が破棄されず、returnされるために必要な処理?

yoichiyy

総合スコア55

Google Apps Script

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

0グッド

0クリップ

投稿2023/01/28 06:07

編集2023/01/28 08:48

実現したいこと

  • 最後のreturnで、message変数を返したい。

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

getSheetMessage() の中で、「message」は問題なく得られているのですが、
呼び出し元の関数内のログで、
Logger.log("メッセージ取得なし")
が表示されてしまいます。取得されているはずの「message」が何らかの理由でreturnされていないようです。

該当のソースコード

Google

1function getSheetMessage() { 2 const ss = SpreadsheetApp.getActiveSpreadsheet(); 3 const sh1 = ss.getSheetByName('data'); 4 const startRows = 2; 5 const sheetData = sh1.getSheetValues(startRows, 1, sh1.getLastRow(), 6 sh1.getLastColumn()); 7 const today = new Date(); 8 9 // シートの各行ごとにデータを取り出す 10 sheetData.forEach(function(value, index) { 11 if (new Date(value[0]).getTime() < today.getTime()) { 12 // sh1.getRange(startRows + index,3 ).setValue("済"); 13 var message = sh1.getRange(startRows + index,2).getValue(); 14 Logger.log(message) // 。。。ログ1 15 // return message; //はじめ、ここにあったが、18行目に移動した 16 } 17 }); 18 Logger.log("forEachの外の"+message) //。。。ログ2 19 return message; 20} 21 22 23//return先の関数’(該当部分抜粋) 24 ・・・ 25 26 const message = getSheetMessage(); 27 if (!message) 28 { 29 Logger.log("メッセージ取得なし"); 30 return; 31 } 32 33 GmailApp.sendEmail("●●●@gmail.com",title,message); 34 35

試したこと

●return が forEachやif文の中にあることがおかしいだろうと思い、現在の位置(19行目)に移しました。
●特に18行目(ログ2)で、messageが空になってしまっていることが確認できています。

ifまたはforEach内で取得した message変数を、
その外にまで持っていくにはどのようにコードを書けばよいか? 
お教えいただきたいです。

*追記:最初に変数を宣言していないためにうまくいかないのかと思い、下記画像38行目のような宣言もしたのですが、やはり反応は同じでした。(コード内のLogger.logでは正常に取得できているが、最後のreturnでは返されない。)
イメージ説明

どうぞよろしくお願い致します。

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

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

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

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

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

guest

回答2

0

ベストアンサー

質問内にある画像のコードで修正例を示します。(目視なので一部異なっているかもしれませんが)
下記7行目のように message を定義しているとして、forEach の中でmessage を使うときは、14行目のように var を削除してみてください。

js

1function getSheetMessageAndPrintDone() { 2 const ss = SpreadsheetApp.getActiveSpreadsheet(); 3 const sh1 = ss.getSheetByName('bot'); 4 const startRows = 2; // 開始行数 5 const sheetData = sh1.getSheetValues(startRows, 1, sh1.getLastRow(), sh1.getLastColumn()); // シートのデータを取得 6 const today = new Date(); 7 var message = ''; 8 9 // シートの各行ごとにデータを取り出す 10 sheetData.forEach(function(value, index) { 11 if (!value[2] && new Date(value[0]).getTime() < today.getTime()) { 12 // sh1.getRange(startRows + index,3 ).setValue("済"); 13 // var message = sh1.getRange(startRows + index,2).getValue 14 message = sh1.getRange(startRows + index,2).getValue(); // <- var を削除した 15 Logger.log(message) 16 // return message; 17 } 18 }); 19 Logger.log("forEachの外の"+message) 20 return message; 21}

投稿2023/01/28 11:34

編集2023/02/04 00:54
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

yoichiyy

2023/01/28 12:14

varとつけることによって、これが「新しい関数の宣言」として働いてしまうということでしょうか。 おそらく基本的なことかと思いつつも、 初めてであり、また感動の!新情報でした。 とても助かりました。 どうも、ありがとうございました。
guest

0

messageをforEachの中ではなく、getSheetMessage直下で宣言してください。

投稿2023/01/28 07:51

maisumakun

総合スコア145183

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

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

yoichiyy

2023/01/28 08:49

そのようにも試したのですが、反応は変わりありませんでした。 宣言の方法が間違っているのか…? アドバイスを頂けますと幸いです。 ご回答くださり、どうもありがとうございました。
maisumakun

2023/01/28 12:54 編集

内側のmessageの宣言は余計です。外側だけの宣言にしてください。 (ちょっと抜けていたので書き足しました)
yoichiyy

2023/01/28 12:13

ご説明不足、失礼いたしました。 内側でmessageにほしいstringを代入?することができます。このため、なんとかして内側でmessageの値を更新しつつ、さらにそれを外側に持っていく…ということを実現したかったのでした。 いずれにしましても、ご回答を下さりどうもありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問