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

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

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

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

JavaScript

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

Q&A

解決済

1回答

2878閲覧

TypeError: Cannot read property 'forEach' of undefinedというエラーを解消したい

atago_IT

総合スコア8

Google Apps Script

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

JavaScript

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

1グッド

1クリップ

投稿2022/09/06 07:31

編集2022/09/06 07:50

前提

Googleカレンダーの予定をSlackのチャンネルに投稿するシステムをGASで開発しています。

実現したいこと

  • Googleカレンダーの予定を取得

  • 取得した予定をWebhookを使ってSlackのチャンネルに投稿

  • 48行目の変数schedulesに36行目から42行目のオブジェクトを格納したい

  • 変数schedulesから55行目のforEach文でオブジェクトプロパティを読み込みたい

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

48行目の変数schedules(配列とその中にオブジェクトが入っているはず)がnullになっている。
よって、55行目のforEach文でオブジェクトプロパティを読み込めない。

エラー TypeError: Cannot read property 'forEach' of undefined notifySlack @ コード.gs:55

該当のソースコード

JavaScript

1let calendarIds = { 2 'XXXXXX': 'XXXXXX', 3 'XXXXXX': 'XXXXXX', 4 'XXXXXX': 'XXXXXX' 5}; 6 7// スケジュールを取得 8function getSchedules() { 9 10 let schedules = []; 11 12 // メンバーのGoogleカレンダーIDを取得 13 let calendarId = Object.keys(calendarIds); 14 calendarId.forEach((calendarId)=>{ 15 16 // メンバーの名前をmemberに代入 17 let member = calendarId; 18 19 // myCalendarに各々のcalendarIdを格納 20 let myCalendar = CalendarApp.getCalendarById(calendarIds[calendarId]); 21 22 // 今日の年月日を取得 23 let today = new Date(); 24 let events = myCalendar.getEventsForDay(today); 25 26 for (let i in events) { 27 let event = events[i]; 28 29 let title = event.getTitle(); 30 31 let startHour = event.getStartTime().getHours(); 32 let startMinute = event.getStartTime().getMinutes(); 33 let endHour = event.getEndTime().getHours(); 34 let endMinute = event.getEndTime().getMinutes(); 35 36 return schedules = { 37 title: title, 38 startHour: startHour, 39 startMinute: startMinute, 40 endHour: endHour, 41 endMinute: endMinute 42 }; 43 }; 44 }); 45}; 46 47function notifySlack() { 48 let schedules = getSchedules(); 49 50 Logger.log(schedules); 51 52 let text = '本日の予定は以下になります。' 53 54 55 schedules.forEach((schedule)=>{ 56 text += '・'+schedule+'\n'; 57 }); 58 59 Logger.log(text); 60 61 let payload = { 62 'username': 'お知らせ', 63 'text': text, 64 'channel': '#general' 65 }; 66 67 let options = { 68 'method': 'post', 69 'contentType': 'application/JSON', 70 'payload': JSON.stringify(payload) 71 }; 72 73 const URL = 'https://hooks.slack.com/services/XXXXXX'; 74 UrlFetchApp.fetch(URL, options); 75}

補足情報(FW/ツールのバージョンなど)

Google Apps Script
OS Raspberry Pi OS 64bit

退会済みユーザー👍を押しています

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

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

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

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

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

YAmaGNZ

2022/09/06 09:25

Googleカレンダーは共有設定されているのですか?
atago_IT

2022/09/08 09:10

共有設定されています。
guest

回答1

0

ベストアンサー

オブジェクトはnullになっているのではなくそのままだとforEachに対応していません。
キーの配列にすることで実現可能。

JavaScript

1Object.keys(schedules).forEach((key)=> { 2 text += '・'+schedules[key]+'\n'; 3});

投稿2022/09/06 10:32

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問