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

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

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

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

Google Apps Script

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

Q&A

解決済

1回答

1880閲覧

google app scriptでTypeError: Cannot read property '9' of undefined at myFunction(コード:27:25)が解消されない

blueisland

総合スコア3

Google スプレッドシート

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

Google Apps Script

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

0グッド

0クリップ

投稿2020/04/22 15:46

前提・実現したいこと

スプレッドシートとgasとchatworkを使って、期限切れのものを自動的にアラートを出す
期限切れ(残り1週間以内)と一致するものを送信する機能を実装中に以下のエラーメッセージが発生しました。

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

TypeError: Cannot read property '9' of undefined at myFunction(コード:27:25)

該当のソースコード

/** * スプレッドシートの1週間以内の商品をチャットワークに送信するBot */ function sendMessage(token,body){ const cw = ChatWorkClient.factory({token:token}); cw.sendMessageToMyChat(body); } /** * チャットワークのマイチャットにメッセージを送信する * * @param {string} チャットワークAPIトークン * @param {string} マイチャットに送信するメッセージ本文 */ function myFunction() { const token = PropertiesService.getScriptProperties().getProperty('CW_TOKEN'); const sheet = SpreadsheetApp.openByUrl('//ここにURL'); const sheet1 = sheet.getSheetByName("//ここにシート名"); const lastRow = sheet1.getLastRow(); const lastColumn = sheet1.getLastColumn(); const values = sheet1.getRange(1, 1, lastRow,lastColumn).getValues(); Logger.log(values[15][9]); let body = '[info][title]1ヶ月期限[/title]'; for(var i = 6; i <= lastRow; i++) { Logger.log(values[i][9]); if(values[i][9] == "残り1週間以内"){ body += values[i][0] + '\n'; //販売日 body += values[i][2] + '\n'; //品番 body += values[i][3] + '\n' +'[hr]'; //商品名 } } Logger.log(body); body += '[/info]'; sendMessage(token, body); }

試したこと

Logger.log(values[i][9]);
のログ結果を見ると、

[20-04-22 08:23:28:086 PDT] 販売中 [20-04-22 08:23:28:088 PDT] 残り1週間以内 [20-04-22 08:23:28:090 PDT] 残り1週間以内 [20-04-22 08:23:28:092 PDT] 1ヶ月経過

とデータはきちんと取れていることが分かりました。

Logger.log(body);
のログ結果を見ると、

[20-04-22 08:23:29:849 PDT] TypeError: Cannot read property '9' of undefined at myFunction(コード:27:25)

となっています。
※この条件式をやるまではchatworkに連携できておりました。

https://qiita.com/quicksort/items/3b7776aba7bd2e97cf46
上記のように、undefindedを回避する方法を試しましたが、うまくいきませんでした。

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

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

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

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

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

guest

回答1

0

ベストアンサー

chatwork側のAPIの仕様なのかもしれませんが、いくつか疑問があります。

const values = sheet1.getRange(1, 1, lastRow,lastColumn).getValues();

ここではシートの左上から、データが存在している列や行分のデータを配列に取っていると思います。
例えば6行10列あれば、values[0][0]~values[5][9]にデータが入りますよね。


その後の

for(var i = 6; i <= lastRow; i++) {

if(values[i][9] == "残り1週間以内"){

これって、iが6からスタートしていますよね。
つまり、1ループ目はvalues[6][9]のデータを取ろうとしていませんか?
なぜ6からスタートなのか分かりませんが、もし6行目からのデータを取りたいのであれば
getRangeで6行目からデータを取得して、iは0からスタートすべきです。
APIの仕様とかが分からないため的外れだったらすいませんが、この可能性はないでしょうか。

投稿2020/04/23 08:20

mkk

総合スコア378

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

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

blueisland

2020/04/23 10:30

ご回答いただき、ありがとうございます!! 5行目までは注意事項とかが書いてあるので、6行目からがデータが入っています。 getrangeで6行目から取得し、i=0から開始しましたが、同様のエラー「Cannot read property '9' of undefined at myFunction(コード:27:25)」が出てしまいました。 APIの仕様の問題でしょうかね?
mkk

2020/04/24 01:34

例えば6行目から9行目にデータが入っている場合は4行分のデータということで i が0~3で4回ループするようにすべきです。 ただ、lastRow って↑の例だと9が入りますよね。 i が0~9でループしてしまっているのではないでしょうか。 Logger.logで何回目のループで失敗しているか確認するためにも ループごとに i の値と配列の中身を見てみてはいかがでしょうか。
blueisland

2020/04/24 08:57

できました!! 余分な分まで取っていました、、、 lastRow-6でやると網羅的に取得できました。 ありがとうございます!!!!!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問