teratail header banner
teratail header banner
質問するログイン新規登録
Google スプレッドシート

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

Q&A

解決済

1回答

768閲覧

スプレッドシートとカレンダー連携のプログラミングについて[getHours][createEvent]

PANDA30271

総合スコア2

Google スプレッドシート

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

0グッド

0クリップ

投稿2022/06/15 22:30

編集2022/06/17 03:27

0

0

html

1スプレッドシートとカレンダー連携させたいのですがgetHoursでエラーが出てしまいます。 2TypeError: Cannot read property 'getHours' of undefined startTime 3 4function registerCalendar() { 5 var calendar= CalendarApp.getCalendarById('Googleid●●●'); 6 var sheet = SpreadsheetApp.getActiveSheet(); 7 var lastRow = sheet .getLastRow(); 8 var contents = sheet.getRange(`A2:E${lastRow}`).getValues(); 9 10 for(var i=0; i < contents.length; i++){ 11 var{status, day, title, startTime, endTime}=contents[i]; 12 if(status=='TRUE'){ 13 continue; 14 } 15 var date=new Date(day); 16 if(startTime=="" || endTime==""){ 17 calendar.createAllDayEvent(title, date) 18 }else{ 19 var startDateObj = new Date(day); 20 startDateObj .setHours(startTime.getHours()); #エラー箇所 21 startDateObj.setMinutes(startTime.getMinutes()); 22 23 var endDateObj = new Date(day); 24 endDateObj.setHours(endTime.getHours()); 25 endDateObj.setMinutes(endTime.getMinutes()); 26 27 calendar.createEvent(title,startDateObj,endDateObj ); 28 } 29 sheet.getRange(`B${i + 2}`).setValue("TRUE"); 30 } 31} 32 33 34 35 36周囲の間違えを探して見たのですが実行できません。 37何を間違えてしまっているのか、ご指導お願いいたします。

>>>上記はスプレットシートの時間に当てはまる列の書式を時間に変えることで解決できました。しかし、まだエラーが出ています。

TypeError: Cannot read property 'createEvent' of null registerCalendar @ コード.gs:24

html

1現在のコード状況 2ーーーーーーーーーーーーーーーー 3function registerCalendar() { 4 var calendar= CalendarApp.getCalendarById('GoogleID●●'); 5 var sheet = SpreadsheetApp.getActiveSheet(); 6 var lastRow = sheet .getLastRow(); 7 var contents = sheet.getRange(`A2:E${lastRow}`).getValues(); 8 9 for(var i=0; i < contents.length; i++){ 10 var[status, day, title, startTime, endTime]=contents[i]; 11 if(status=='TRUE'){ 12 continue; 13 } 14 var date=new Date(day); 15 if(startTime=="" || endTime==""){ 16 calendar.createAllDayEvent(title, date) 17 }else{ 18 var startDateObj = new Date(day); 19 startDateObj.setHours(startTime.getHours()); 20 startDateObj.setMinutes(startTime.getMinutes()); 21 22 var endDateObj = new Date(day); 23 endDateObj.setHours(endTime.getHours()); 24 endDateObj.setMinutes(endTime.getMinutes()); 25 26 calendar.createEvent(title,startDateObj,endDateObj ); #エラー箇所 27 } 28 sheet.getRange(`A${i + 2}`).setValue("TRUE"); 29 } 30}

使用しているスプレットシートは下記の表です。
※titleに人物名が入るようにしたいです。

連携済日付名前(title)開始終了
2022/0601山田 花子10:00:0018:00:00
2022/0602山田 花子16:00:0019:00:00
2022/0603山田 花子16:30:0020:00:00
2022/0604山田 花子16:30:0020:00:00
2022/0601鈴木 太郎9:00:0018:00:00
2022/0603鈴木 太郎16:30:0019:00:00

>>>自分で試したこと
createEvent()について検索をかけて他の方の作ったコードと違いを見て見たりしましたが原因がわかりませんでした。

自分では解決できそうにありません。
どうかお力添えお願いいたします。

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

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

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

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

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

y_waiwai

2022/06/15 22:42

エラーが出たなら、エラーメッセージを提示しましょう エラーメッセージは、よけいな省略翻訳しないで出たそのママをコピペで提示してください
k.a_teratail

2022/06/16 01:50 編集

このようなエラーが発生している認識で問題ないでしょうか? TypeError: Cannot read property 'getHours' of undefined startTimeはスプレッドシートから値を取得した際、 セルの書式によっては文字列になります。 なので、文字列にはgetHours()のメソッドが存在しないので、エラーになっているのではないかと セルの書式を「時間」か「日時」にしても同じエラーが出ますでしょうか? また、スプレッドシートのA2〜E2セルの値はどのようなものでしょうか? 補足: > var{status, day, title, startTime, endTime}=contents[i]; こちらは分割代入を行なっているようですが、デバッグで確認したところ代入できておらず、「undefined」でした。 正しい分割代入は下記になります。 var[status, day, title, startTime, endTime]=contents[i];
PANDA30271

2022/06/16 14:33

y_waiwai様、k.a_teratail様 ご返信ありがとうございます。 エラーの内容はその通りで書式変更で解決できました。 次からはエラ〜メッセージもきちんと載せます。 また、他の修正箇所も見つけていただきありがとうございます。
PANDA30271

2022/06/16 14:50

また別のエラーが出たので質問を編集、加えさせていただきます。
guest

回答1

0

ベストアンサー

gs

1 var calendar= CalendarApp.getCalendarById('PANDA30271');

正しいカレンダーIDが設定されていないのではないでしょうか?
カレンダーID確認方法

それと、スプレッドシートの日付カラム値は「年/月/日」で「/」区切りにしないと日付を認識しないようです。
「2022/0601」だと「startDateObj: Invalid Date」、「endDateObj: Invalid Date」となります。
処理自体はエラーにはなりませんが、カレンダーへの登録が行われないので、スプレッドシートの日付カラム値は「年/月/日」の形で修正が必要です。


こちらで試したところ、問題なくカレンダーに登録されました。

スプレッドシート

実施前実施後
イメージ説明イメージ説明

カレンダー

実施前実施後
イメージ説明イメージ説明

投稿2022/06/16 23:30

k.a_teratail

総合スコア845

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

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

PANDA30271

2022/06/17 14:56 編集

できました!! 初めてのコード入力でネットに上がっているものを写しているのにできないし、、検索ヒットしないし、、、 諦めかけていたところ救われました(涙) B列は書式を日付に設定していたので疑うことなく使っていたのですが、こんなこともあるのですね。 気づきと発想の大切さを感じました。勉強になりました。 本当にありがとうございます。 こんなに早く返答いただけると思っていなかったのでありがたい限りです。 福祉の現場にいるのですが、事務作業が軽くなったら職場の人みんなが現場でもう少し余裕持てると思っているんです。 今回のコードが第一歩なので頑張ります。ありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問