以下の記事を参考に今年度の祝日を自動で取得するようなスクリプトを作成したいと考えています。
https://qiita.com/ik-fib/items/6c35640954c2b04a9287
ただし、このスクリプトを実行すると以下のようなエラーメッセージが表示されます。
TypeError: Cannot find function getEvents in object . (line 57, file "Holidays")
Developers Guideを確認すると、**getEvents(startTime, endTime)**と記載がされているのに対し現在のコードではstartDateとendDateが日付形式になっているからかなと思ったのですが...時間形式じゃないといけないのでしょうか?
var SHEET_URL = "https://docs.google.com/spreadsheets/d/●●●●●●●●●●●●●●●●●●●●●●●●"; var SHEET_NAME = "祝日一覧"; function holiday_main() { // 今年の1/1から var startDate = new Date(); startDate.setMonth(0, 1); startDate.setHours(0, 0, 0, 0); // 来年の12/31まで var endDate = new Date(); endDate.setFullYear(endDate.getFullYear() + 1, 11, 31); endDate.setHours(0, 0, 0, 0); var sheet = getholidaysheet(); var holidays = getHoliday(startDate, endDate); var lastRow = sheet.getLastRow(); var startRow = 1; // シートが空白で無いとき、取得した祝日配列の先頭の日付と一致するカラムの位置を探索 if (lastRow > 1) { var values = sheet.getRange(1, 1, lastRow, 1).getValues(); for(var i = 0; i < lastRow; i++) { if(values[i][0].getTime() == holidays[0][0].getTime()) { break; } startRow++; } } sheet.getRange(startRow, 1, holidays.length, holidays[0].length).setValues(holidays); } /** * SHEET_URLで指定したドキュメント内のSHEET_NAMEのシートを取得する * SHEET_NAMEのシートが存在しない時は、シートを作成する */ function getholidaysheet(){ var ss = SpreadsheetApp.openByUrl(SHEET_URL); var sheet = ss.getSheetByName(SHEET_NAME); if(sheet == null) { sheet = ss.insertSheet(SHEET_NAME); } return sheet; } /** * startDate〜endDateまでの祝日をgoogleカレンダーの「日本の祝日」から取得 * [日付,祝日名]の多次元配列にした上で返す */ function getHoliday(startDate, endDate) { var cal = CalendarApp.getCalendarsByName('日本の祝日'); var holidays = cal.getEvents(startDate, endDate); var values = []; for(var i = 0; i < holidays.length; i++) { values[i] = [holidays[i].getStartTime(), holidays[i].getTitle()]; } return values; }
> cal.getEventsがうまく動かないというエラーメッセージ
こちらをもう少し詳しくお願いします。
> Developers Guideを確認すると、getEvents(startTime, endTime)と記載がされている
両方共Dateなので問題ないように思いますが...
startTime Date the start of the time range
endTime Date the end of the time range, non-inclusive
以下のようなエラーが表示されてしまいます
TypeError: Cannot find function getEvents in object . (line 57, file "Holidays")
参考にしたサンプルでは
var cal = CalendarApp.getCalendarById("ja.japanese#holiday@group.v.calendar.google.com");
と書いてありますが、
var cal = CalendarApp.getCalendarsByName('日本の祝日');
とした理由はありますか?
また、getCalendarsByName なので、結果は複数取得されますよね。
つまり、 cal は配列なので、getEventsという関数はないよ、と言われています。
cal[0].getEventsなら使えるかもしれません。
参考にしたサンプルに記載されているコードを
var cal = CalendarApp.getCalendarById("ja.japanese#holiday@group.v.calendar.google.com");
使用し実行したら、「TypeError: Cannot call method "getEvents" of null. (line 58, file "Holidays")」と表示されたため、日本の祝日カレンダーがうまく取得できていなかったため、
別表記の
var cal = CalendarApp.getCalendarsByName('日本の祝日');
に変更しました
なるほど。
cal[0] は試されましたか?
もともとのものが動かなかった原因と思われるものは下記の記事で説明があったのでそちらを試してみては。
http://syasuda.com/d/blog/2016/11/googleid.html
@tetsunosukeさん
cal[0]を試してみたところうまく行かなかったのですが、共有していただいた記事のように自分のカレンダーから日本の祝日カレンダーのIDを引っ張って使用したらうまく動きました。
ありがとうございました!
解決してよかったです!
回答1件
あなたの回答
tips
プレビュー