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

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

ただいまの
回答率

90.12%

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 256

sports111

score 6

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • tetsunosuke

    2019/05/13 17:05

    なるほど。
    cal[0] は試されましたか?

    もともとのものが動かなかった原因と思われるものは下記の記事で説明があったのでそちらを試してみては。
    http://syasuda.com/d/blog/2016/11/googleid.html

    キャンセル

  • sports111

    2019/05/13 17:11

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

    ありがとうございました!

    キャンセル

  • tetsunosuke

    2019/05/13 19:02

    解決してよかったです!

    キャンセル

回答 1

check解決した方法

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");

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.12%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる