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

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

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

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

Q&A

解決済

1回答

2752閲覧

Google Apps Scriptを使ってGoogle Calendarから自動で祝日を取得したい

sports111

総合スコア8

Google Apps Script

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

0グッド

0クリップ

投稿2019/05/13 07:36

編集2019/05/13 07:46

以下の記事を参考に今年度の祝日を自動で取得するようなスクリプトを作成したいと考えています。
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; }

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

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

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

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

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

tetsunosuke

2019/05/13 07:40

> 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
sports111

2019/05/13 07:43

以下のようなエラーが表示されてしまいます TypeError: Cannot find function getEvents in object . (line 57, file "Holidays")
tetsunosuke

2019/05/13 07:47

参考にしたサンプルでは var cal = CalendarApp.getCalendarById("ja.japanese#holiday@group.v.calendar.google.com"); と書いてありますが、 var cal = CalendarApp.getCalendarsByName('日本の祝日'); とした理由はありますか? また、getCalendarsByName なので、結果は複数取得されますよね。 つまり、 cal は配列なので、getEventsという関数はないよ、と言われています。 cal[0].getEventsなら使えるかもしれません。
sports111

2019/05/13 07:54

参考にしたサンプルに記載されているコードを 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('日本の祝日'); に変更しました
sports111

2019/05/13 08:11

@tetsunosukeさん cal[0]を試してみたところうまく行かなかったのですが、共有していただいた記事のように自分のカレンダーから日本の祝日カレンダーのIDを引っ張って使用したらうまく動きました。 ありがとうございました!
tetsunosuke

2019/05/13 10:02

解決してよかったです!
guest

回答1

0

自己解決

@tetsunosukeさんが共有してくださった以下の記事に書いてある通り、
http://syasuda.com/d/blog/2016/11/googleid.html
自分のGoogle Calendarに日本の祝日カレンダーを登録し、その設定からCalendar IDを確認してコードに埋め込めば正しく作動します。

私の場合はCalendar IDを以下に変更したらうまく作動しました。

var cal = CalendarApp.getCalendarById("en.japanese#holiday@group.v.calendar.google.com");

投稿2019/05/13 08:52

編集2019/05/13 08:53
sports111

総合スコア8

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問