前提
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/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
const year =の下に
Logger.log(year);
を入れた場合に問題ないですか?
ご回答ありがとうございます。
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);
const startDate = new Date("2023/01/01");
const endDate = new Date("2024/01/01");
も試してみたのですがやはりholidayListがundefinedになてしまいます
こちらの環境では提示されているソースコードをそのままコピペでエラーも出ず問題なく動作している状況です。
現状は実行完了せずにエラーが発生している状態ですか?
あれ、どうしてなのだろう…色々ブラウザ変えたりして試してみたのですが、
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のままです
祝日カレンダーにアクセスできてないのかもしれません。
↓の2行だけでいいので実行したら「日本の祝日」というカレンダー名が取得されますか?
const holidayCalendar = CalendarApp.getCalendarById('ja.japanese#holiday@group.v.calendar.google.com')
console.log(holidayCalendar.getName())
さっそく試してみたのですが、
TypeError: Cannot read properties of null (reading 'getName')
となってしまうので、こちらの実行環境に何か原因がある感じですよね…。
最近たまにブラウザがフリーズしたりがあるので、一度ブラウザをアンインストールして、またインストールしたりして試して、また報告します。お手数おかけして申しわけありません。
恐らく設定等が原因になりそうですね。
自分の環境ではなにもしていないのですが調べていると
スクリプトエディタの設定から
「appsscript.json」マニフェスト ファイルをエディタで表示する」にチェック
コード欄に「appscript.json」が出てくるのでそこに
"oauthScopes": [
"https://www.googleapis.com/auth/calendar.readonly"
]
を追加した というような記事が見つかりました。
https://qiita.com/GasVis/items/a8ef3da3481a8e320a13
色々と調べてくださりありがとうございます。
試してみたのですが以下のエラーが出てしまいました。
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の環境に問題がある、という事なのかなと。
別PCでもやはり同じエラーになってしまったのですが、トラブルが起きてるのがテスト用に作ったアカウントなのですが、カレンダーにアクセスしたことが一度もありませんでした。
それで一度カレンダーにアクセスしてから試したらエラーなく完了しました。
自己解決ということでこの質問は閉じます。
色々と調べてくださってありがとうございました。
回答1件
あなたの回答
tips
プレビュー