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

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

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

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

Q&A

解決済

2回答

4207閲覧

GAS エラー内容の解消

lens.takashii

総合スコア1

Google Apps Script

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

0グッド

1クリップ

投稿2021/10/12 15:27

前提・実現したいこと

GAS スプレッドシートに入力した内容をカレンダーに反映させたいが、エラーが表示される。
エラーの解消を実施したいが原因が不明
スクリプトを実行するとエラー表示はされるがカレンダーには入力内容が反映している。

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

エラーメッセージ エラー TypeError: starttime.getHours is not a function (匿名) @ カレンダー一括入力.gs:40 createEvents @ カレンダー一括入力.gs:14 ### 該当のソースコード function createEvents() { //スプレッドシート内のデータ取得 var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheet = ss.getSheetByName("一括入力(カレンダー)") var rows = sheet.getLastRow()-5; var datas = sheet.getRange(6,1,rows,10).getValues(); //B2セルの値を取得 var id = sheet.getRange(2,2).getValues(); console.log(id) //カレンダーIDを取得 var calendar = CalendarApp.getCalendarById(id); //繰り返し0~9の値を取得 datas.forEach(function(data){ var title = data[0]; var allday = data[1]; var daystart = data[2]; var dayend = data[3]; var starttime = data[4]; var endtime = data[5]; var description = data[6]; var location = data[7]; var guests = data[8]; var sendInvites = data[9]; //オプション機能(説明・場所・招待者・メール送信) var options = { description:description, location:location, guests:guests, sendInvites:sendInvites } //終日フラグにチェックマークあるなしの分岐 if(allday == true){ var event = calendar.createAllDayEvent(title,daystart,dayend,options); } else { // 開始日時を取得しカレンダーに入力 var startdate = new Date(daystart); startdate.setHours(starttime.getHours()) console.log(startdate) startdate.setMinutes(starttime.getMinutes()); // 終了日時を取得しカレンダー入力 var enddate = new Date(dayend); enddate.setHours(endtime.getHours()) enddate.setMinutes(endtime.getMinutes()); var event = calendar.createEvent(title,startdate,enddate,options); } event.setGuestsCanModify(true); }); // ブラウザへ完了通知 Browser.msgBox("カレンダーに入力完了"); }

試したこと

小文字・大文字などのスペルのミスがないか確認したが問題はなさそう

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答2

0

空白のような全くあさっての値が入っている可能性もありますが、文字列で入っていたりしないかなという気がしました。
特に、"13:30" のような全角コロンを想定しました。

不正な時刻に対しては、デフォルトの時刻を設定することにして、ログに何行目がおかしいかを書いてみるのはどうでしょうか。

javascript

1const q364120 = () => { 2 const sheet = SpreadsheetApp.getActive().getSheetByName("一括入力(カレンダー)"); 3 const rows = sheet.getLastRow()-5; 4 const data = sheet.getRange(6,1,rows,10).getValues(); 5 const calenderId = sheet.getRange(2,2).getValues(); 6 // console.log(calenderId); 7 const calendar = CalendarApp.getCalendarById(calenderId); 8 data.forEach((r,i) => { 9 const [title, allDay, startDay, endDay, startTime, endTime, description, location, guests, sendInvites] = r; 10 if(title === "" || startDay === "" || endDay === "") return; 11 const calenderOption = { 12 description:description, 13 location:location, 14 guests:guests, 15 sendInvites:sendInvites 16 } 17 if(allDay === true){ 18 calendar.createAllDayEvent(title,startDay,endDay,calenderOption).setGuestsCanModify(true); 19 return; 20 } 21 // 開始日時を取得しカレンダーに入力 22 const start = new Date(startDay); 23 start.setHours(9,0); // エラー時のデフォルト 24 const end = new Date(endDay); 25 end.setHours(17,30); // エラー時のデフォルト 26 const startTimeParsed = parseTimeLike(startTime); 27 if(startTimeParsed[0]) { start.setHours(...startTimeParsed.slice(1));} else { console.log(`${i+6} 行目の開始時間が不正です`); } 28 const endTimeParsed = parseTimeLike(endTime); 29 if(endTimeParsed[0]) { end.setHours(...endTimeParsed.slice(1));} else { console.log(`${i+6} 行目の終了時間が不正です`); } 30 calendar.createEvent(title,start,end,option); 31 }); 32 Browser.msgBox("カレンダーに入力完了"); 33} 34const parseTimeLike = (value) => { 35 // google apps script で getValues すると、number,boolean,string,date が取得できる 36 // https://developers.google.com/apps-script/reference/spreadsheet/range#getValues() 37 // Date は object 型となる 38 if(typeof value === 'number' || typeof value === 'boolean') return [false,-1,-1]; 39 if(typeof value === 'object') return [true, value.getHours(), value.getMinutes()]; 40 if(value === "") return [false,-1,-1]; 41 const stringExpressionOfTime = value.match(/^(\d{1,2})[::](\d{1,2})$/); 42 if(stringExpressionOfTime === null) return [false,-1,-1]; 43 return [true,stringExpressionOfTime[1],stringExpressionOfTime[2]]; 44}

投稿2021/10/15 16:36

papinianus

総合スコア12705

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

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

0

ベストアンサー

var starttime = data[4];

ここで取り出しているE列のデータが日時の形式になっていないのでdata[4]starttimeもDateオブジェクトになっておらず、したがってgetHoursメソッドが存在しないためエラーになっていると思われます。

カレンダーには入力内容が反映しているということですが、それはdatas.forEachdatasは途中まで正常なデータになっていて、それがカレンダーに反映されており、datasにおそらく余計な行が入っていて、そこで上記の状況となり、エラーになっているのではないでしょうか。

投稿2021/10/12 16:14

itagagaki

総合スコア8402

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

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

lens.takashii

2021/10/22 11:37

返答が遅くなり申し訳ございません。 回答ありがとうございます。 内容は何となく理解できました。 エラーでもデータが入力される件については、指定した日にちの時間帯も問題なくカレンダーには入力されているという現状です。 一度修正してみようと思いますが scriptの本体は崩さず上手く変更出来たりする方法などのアドバイスなど頂けないでしょうか。 宜しくお願い致します。
itagagaki

2021/10/23 05:39

私なら startdate.setHours(starttime.getHours()) の直前に console.log(starttime); を書いてみて、実行ログを見てみますね。 どこまでうまくいっていて、どこでエラーになっているのか、すぐにわかると思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問