html
スプレッドシートとカレンダー連携させたいのですがgetHoursでエラーが出てしまいます。 TypeError: Cannot read property 'getHours' of undefined startTime function registerCalendar() { var calendar= CalendarApp.getCalendarById('Googleid●●●'); var sheet = SpreadsheetApp.getActiveSheet(); var lastRow = sheet .getLastRow(); var contents = sheet.getRange(`A2:E${lastRow}`).getValues(); for(var i=0; i < contents.length; i++){ var{status, day, title, startTime, endTime}=contents[i]; if(status=='TRUE'){ continue; } var date=new Date(day); if(startTime=="" || endTime==""){ calendar.createAllDayEvent(title, date) }else{ var startDateObj = new Date(day); startDateObj .setHours(startTime.getHours()); #エラー箇所 startDateObj.setMinutes(startTime.getMinutes()); var endDateObj = new Date(day); endDateObj.setHours(endTime.getHours()); endDateObj.setMinutes(endTime.getMinutes()); calendar.createEvent(title,startDateObj,endDateObj ); } sheet.getRange(`B${i + 2}`).setValue("TRUE"); } } 周囲の間違えを探して見たのですが実行できません。 何を間違えてしまっているのか、ご指導お願いいたします。
>>>上記はスプレットシートの時間に当てはまる列の書式を時間に変えることで解決できました。しかし、まだエラーが出ています。
TypeError: Cannot read property 'createEvent' of null registerCalendar @ コード.gs:24
html
現在のコード状況 ーーーーーーーーーーーーーーーー function registerCalendar() { var calendar= CalendarApp.getCalendarById('GoogleID●●'); var sheet = SpreadsheetApp.getActiveSheet(); var lastRow = sheet .getLastRow(); var contents = sheet.getRange(`A2:E${lastRow}`).getValues(); for(var i=0; i < contents.length; i++){ var[status, day, title, startTime, endTime]=contents[i]; if(status=='TRUE'){ continue; } var date=new Date(day); if(startTime=="" || endTime==""){ calendar.createAllDayEvent(title, date) }else{ var startDateObj = new Date(day); startDateObj.setHours(startTime.getHours()); startDateObj.setMinutes(startTime.getMinutes()); var endDateObj = new Date(day); endDateObj.setHours(endTime.getHours()); endDateObj.setMinutes(endTime.getMinutes()); calendar.createEvent(title,startDateObj,endDateObj ); #エラー箇所 } sheet.getRange(`A${i + 2}`).setValue("TRUE"); } }
使用しているスプレットシートは下記の表です。
※titleに人物名が入るようにしたいです。
連携済 | 日付 | 名前(title) | 開始 | 終了 |
---|---|---|---|---|
□ | 2022/0601 | 山田 花子 | 10:00:00 | 18:00:00 |
□ | 2022/0602 | 山田 花子 | 16:00:00 | 19:00:00 |
□ | 2022/0603 | 山田 花子 | 16:30:00 | 20:00:00 |
□ | 2022/0604 | 山田 花子 | 16:30:00 | 20:00:00 |
□ | 2022/0601 | 鈴木 太郎 | 9:00:00 | 18:00:00 |
□ | 2022/0603 | 鈴木 太郎 | 16:30:00 | 19:00:00 |
>>>自分で試したこと
createEvent()について検索をかけて他の方の作ったコードと違いを見て見たりしましたが原因がわかりませんでした。
自分では解決できそうにありません。
どうかお力添えお願いいたします。
エラーが出たなら、エラーメッセージを提示しましょう
エラーメッセージは、よけいな省略翻訳しないで出たそのママをコピペで提示してください
このようなエラーが発生している認識で問題ないでしょうか?
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];
y_waiwai様、k.a_teratail様 ご返信ありがとうございます。
エラーの内容はその通りで書式変更で解決できました。
次からはエラ〜メッセージもきちんと載せます。
また、他の修正箇所も見つけていただきありがとうございます。
また別のエラーが出たので質問を編集、加えさせていただきます。
まだ回答がついていません
会員登録して回答してみよう