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

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

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

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

Q&A

解決済

1回答

2420閲覧

GASで祝日リストを取得することが出来ない

yama_ai

総合スコア11

Google Apps Script

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

0グッド

0クリップ

投稿2022/12/06 03:25

前提

GASで2023年の祝日一覧を取得しようと思っているのですが、上手くいきません。

下記スクリプトを作ってみたのですが、holidayListがundefinedになってしまいます。

ja.japanese#holiday@group.v.calendar.google.com

は何度も確認してから入力したので入力ミスはないと思うのですが、自分では間違ってる箇所を切り分けることが出来ませんでした。

どこを修正したら良いかご教示いただけないでしょうか。

尚、

const spreadsheetName = spreadsheet.getName().split("年");

この部分ですが、シート名が20**年○○となっているので、spreadsheetName[0]に2022とか2023とかの年が入るようになっています。下記ソースでデバッグした際、変数yearに2023が入っています。

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

TypeError: Cannot read properties of null (reading 'getEvents')

該当のソースコード

GAS

1function test(){ 2 //スプレッドシートを取得 3 const spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); 4 //シート名から年を取得 5 const spreadsheetName = spreadsheet.getName().split("年"); 6 const year = Number(spreadsheetName[0]);//データの型をnumber型に変換 7 8 //開始日時と終了日時を指定し、カレンダーから祝日リストを取得 9 const startDate = new Date(year,0,1,0,0,0,0);//開始日時 10 const endDate = new Date(year+1,0,1,0,0,0,0);//終了日時 11 const holidayList = CalendarApp.getCalendarById("ja.japanese#holiday@group.v.calendar.google.com").getEvents(startDate, endDate); 12 13 //結果を表示 14 Logger.log(startDate); 15 Logger.log(endDate); 16 Logger.log(holidayList); 17}

試したこと

ここに問題に対して試したことを記載してください。

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

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

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

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

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

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

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

bebebe_

2022/12/06 04:20

const year =の下に Logger.log(year); を入れた場合に問題ないですか?
yama_ai

2022/12/06 04:29

ご回答ありがとうございます。 const year のすぐ下に Logger.log(year); を入れたみたのですが、 2023.0 という結果がかえってきました。 もしかして小数点入ってるからダメだったのかな?と思い、変数yearを使用せずにstartDateとendDateを下記のようにしてみましたが、やはり同じエラーになってしまいました const startDate = new Date(2023,0,1,0,0,0,0); const endDate = new Date(2024,0,1,0,0,0,0);
yama_ai

2022/12/06 04:38

const startDate = new Date("2023/01/01"); const endDate = new Date("2024/01/01"); も試してみたのですがやはりholidayListがundefinedになてしまいます
bebebe_

2022/12/06 04:47 編集

こちらの環境では提示されているソースコードをそのままコピペでエラーも出ず問題なく動作している状況です。 現状は実行完了せずにエラーが発生している状態ですか?
yama_ai

2022/12/06 05:14

あれ、どうしてなのだろう…色々ブラウザ変えたりして試してみたのですが、 TypeError: Cannot read properties of null (reading 'getEvents') というエラーが毎回出てしまいます… const holidayList = CalendarApp.getCalendarById("ja.japanese#holiday@group.v.calendar.google.com").getEvents(startDate, endDate); ここでやはりholidayListがundefinedのままです
bebebe_

2022/12/06 05:24

祝日カレンダーにアクセスできてないのかもしれません。 ↓の2行だけでいいので実行したら「日本の祝日」というカレンダー名が取得されますか? const holidayCalendar = CalendarApp.getCalendarById('ja.japanese#holiday@group.v.calendar.google.com') console.log(holidayCalendar.getName())
yama_ai

2022/12/06 05:33

さっそく試してみたのですが、 TypeError: Cannot read properties of null (reading 'getName') となってしまうので、こちらの実行環境に何か原因がある感じですよね…。 最近たまにブラウザがフリーズしたりがあるので、一度ブラウザをアンインストールして、またインストールしたりして試して、また報告します。お手数おかけして申しわけありません。
bebebe_

2022/12/06 05:46

恐らく設定等が原因になりそうですね。 自分の環境ではなにもしていないのですが調べていると スクリプトエディタの設定から 「appsscript.json」マニフェスト ファイルをエディタで表示する」にチェック コード欄に「appscript.json」が出てくるのでそこに "oauthScopes": [ "https://www.googleapis.com/auth/calendar.readonly" ] を追加した というような記事が見つかりました。 https://qiita.com/GasVis/items/a8ef3da3481a8e320a13
yama_ai

2022/12/06 08:08

色々と調べてくださりありがとうございます。 試してみたのですが以下のエラーが出てしまいました。 Exception: You do not have permission to call SpreadsheetApp.getActiveSpreadsheet. Required permissions: (https://www.googleapis.com/auth/spreadsheets.currentonly || https://www.googleapis.com/auth/spreadsheets) 権限がない~ということなので、readonlyで読み取り専用?になってしまってるからなのか最初の const spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); の段階でエラーになってしまうようです。 別のPCで後ほど同じコードで試してみようとおもいます。 もしこれで実行できればいま使ってるPCの環境に問題がある、という事なのかなと。
yama_ai

2022/12/09 02:32

別PCでもやはり同じエラーになってしまったのですが、トラブルが起きてるのがテスト用に作ったアカウントなのですが、カレンダーにアクセスしたことが一度もありませんでした。 それで一度カレンダーにアクセスしてから試したらエラーなく完了しました。
yama_ai

2022/12/09 02:36

自己解決ということでこの質問は閉じます。 色々と調べてくださってありがとうございました。
guest

回答1

0

自己解決

コード内に間違いはないみたいだったのですが、何度やっても上手くいきませんでした。
しかし、トラブルが起きているのがテスト用に作ったアカウントで、カレンダーには一度もアクセスしたことがありませんでした。

それで試しに祝日以外のカレンダーID取得してテストしよう…と思ってカレンダーにアクセスし、それからコードをいじらないで再度デバッグしたら問題なく完了しました。

CalendarAppを使うにはそのアカウントで一度カレンダーにアクセスする必要がある、という事なのかもしれないです(初心者なのでトンチンカンなこと書いてたらすみません)。

投稿2022/12/09 02:36

yama_ai

総合スコア11

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問