タイダログ

もっと怠けますか? (y/n)

Google カレンダーと Google スライドで予定までの日数を視覚化する

Google カレンダーと Google スライドで予定までの日数を視覚化する

Google カレンダーに登録したそれぞれの予定までの日数を Google スライド上で視覚化する方法を考えたので紹介します。仕事の優先順位を考えるのに使えると思います。

作業環境

  • Google アカウント(個人用)
  • Windows 10 Home 22H2 (OS Build 19045.3086)
  • FireFox 115.0 (64 ビット)

やりたいこと

Google カレンダーに登録した予定を Google スライド上に表示しつつ、それぞれの予定までの残り日数を視覚的に表現します。「残り4日」と言われましても、あんまりピンと来ないんですよね……。

また、[スケジュール] ビューにすると予定のみを表示することができますが、これだとそれぞれの予定の間の日数が分かりにくくなるので、私には向いていないように感じています。

完成図

完成図

Google スライドに GIF 画像を貼るとプレゼンテーション中にも動いてくれます。テンションが上がりますね。

手順

Google にログインする

まずは Google にログインします。Google のトップページを開いた時に、画面右上に自分の名前やアイコンが出ていれば既にログインしています。

ログインしていない場合は、画面右上の「ログイン」の文字をクリックしてください。

新しいスプレッドシートを作成する

Google のトップページGoogle カレンダーなどの画面右上にある点9個のボタンをクリックしてください。Google のサービス一覧が出ます。ちなみにこの点9個のボタンをキャンディボックスと呼ぶそうです。この一覧から「スプレッドシート」を探してクリックしてください。

Google スプレッドシートを開く図

左上にある「+」ボタン(空白と書いてあるやつ)をクリックしてください。そうするとフォームの作成画面が開きます。

「空白」をクリックする図

スプレッドシートを編集する前に、真っ先にファイル名を付けてください。「無題のスプレッドシート」のままだと、後から探すときに苦労します。今回は「イベントまでの日数」としました。

ファイル名を付ける図

スプレッドシートにプログラムを追加する

Google カレンダーの予定をスプレッドシートに転記するためのプログラムを作成します。といっても基本的にコピペで済みます。

画面上部のメニューを [拡張機能] > [Apps Script] の順でクリックしてください。「Apps Script」という画面が開くはずです。この画面をスクリプトエディタ、あるいは単にエディタと呼びます。このエディタで、Google フォームなどの Google 製サービス上で動く GAS というプログラミング言語でプログラムを書くことがでます。

スクリプトエディタの図

何はともあれ、画面左上の「無題のプロジェクト」の部分を変更しましょう。「無題の○○」が増えていくとどれがどれだか分からなくなります。ここでは「イベントまでの日数」としました。

プロジェクト名を変更する図

プロジェクト名を変更したら、いよいよプログラムの貼り付けです。エディタにもともと入っているであろう

function myFunction() {
  
}

というコードを全て消してから、以下のコードを貼り付けて保存 (Ctrl + S) してください。

function outputCalendarEvents() {
  // スプレッドシートの A1 セルから C1 セルに入力するヘッダー
  const headers = ["イベント", "開始日", "終了日"]

  // イベントを取得する期間の日数
  const duration = 180

  // イベントを取得するカレンダーの ID
  // `CalendarApp.getDefaultCalendar().getId()` はユーザのデフォルトカレンダーの ID
  const calendarIds = [
    CalendarApp.getDefaultCalendar().getId(),
    "0123456789abcdefghijklmnopqrstuvwxyz@group.calendar.google.com",
    "zyxwvutsrqponmlkjihgfedcba9876543210@group.calendar.google.com"
  ]

  // ID からカレンダーを取得
  const calendars = calendarIds.map(x => {
    return { id: x, calendar: CalendarApp.getCalendarById(x)}
  })

  // イベントを取得する期間の開始日(今日)と終了日(今日の duration 日後)
  const startTime = new Date(new Date().setHours(0, 0, 0, 0))
  const endTime = new Date(new Date(startTime).setDate(startTime.getDate() + duration))

  // カレンダーのうち ID が間違っているなどしてアクセスできなかったものを除き、イベントの情報を取得
  // 取得する情報は、イベントのタイトル、開始日および終了日
  const events = calendars.
    filter(x => x.calendar !== null).
    map(x => x.calendar.getEvents(startTime, endTime)).
    flat().
    map(x => {
      if (x.isAllDayEvent()) {
        const previousDay = new Date(x.getAllDayEndDate().setDate(x.getAllDayEndDate().getDate() - 1))
        return [x.getTitle(),x.getAllDayStartDate(), previousDay]
      } else {
        return [x.getTitle(), x.getStartTime(), x.getEndTime()]
      }
    })

  // 取得したイベントの情報をスプレッドシートに転記
  if (events.length > 0) {
    const sh = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet()
    sh.getRange(1, 1, 1, events[0].length).getDataRegion(SpreadsheetApp.Dimension.ROWS).clearContent()
    sh.getRange(1, 1, 1, headers.length).setValues([headers])
    sh.getRange(2, 1, events.length, events[0].length).setValues(events)
  }

  // ID が間違っているなどして取得できなかったカレンダーの ID をログに出力
  const notFoundNames = calendars.
    filter(x => x.calendar === null).
    map(x => x.id).
    reduce((prev, curr) => prev + "\n" + curr)
  Logger.log(`以下の ID のカレンダーが見つかりませんでした。ID が間違っていないか確認してください。:\n${notFoundNames}`)
}

コードを貼り付けた図 (1)

コードを貼り付けた図 (2)

12~13行目の 0123456789abcdefghijklmnopqrstuvwxyz@group.calendar.google.com のような部分は、予定を取得したいカレンダーのカレンダー ID に置き換えてください。

デフォルトカレンダー(ユーザ名のカレンダー)の予定のみ取得したい場合は、10~14行目を以下のように書き換えてください。

  const calendarIds = [
    CalendarApp.getDefaultCalendar().getId()
  ]

貼り付けて保存したら、一度テストしてみましょう。エディタ画面上部の [デバッグ] ボタンの左の部分が outputCalendarEvents になっていることを確認して、なっていなければそれにしてから [実行] ボタンをクリックしてください。

プログラムを実行する図

初回のみ、[承認が必要です] というメッセージが出るはずです。

「承認が必要です」の図

承認の流れはこちらのページでご覧ください。個人用アカウントと学校用または職場用アカウントで多少異なりますが、とにかく自分のアカウントを選択して注意事項を読み、問題なければ [許可] をクリックしてください。

note.com

承認したらプログラムが動き、スプレッドシートに予定が入ったはずです。見に行きましょう!

おー入ってる。こんなにいらない!

スプレッドシートに予定が入った図

最後に、プログラムの実行を自動化して、カレンダーに予定を追加する度にスプレッドシートを自動で更新するように設定します。画面左端の時計のアイコン(トリガーアイコン)をクリックしてください。

トリガーアイコンをクリックする図

「トリガー」という画面になるはずです。

画面右下の [+ トリガーを追加] ボタンをクリックし、

[+ トリガーを追加] ボタンの図

以下のように設定して保存してください。

項目 設定内容
実行する関数を選択 outputCalendarEvents
実行するデプロイを選択 Head
イベントのソースを選択 カレンダーから
カレンダーの詳細を入力 カレンダー更新済み
カレンダーのオーナーのメールアドレス (カレンダーのオーナーのメールアドレス)
エラー通知設定 今すぐ通知を受け取る

トリガーの設定の図

以下のようになっていれば成功です。

トリガーの設定成功の図

ではカレンダーに予定を入れてみて、スプレッドシートが自動で更新されるかテストしましょう。カレンダーに予定を入力。数秒のタイムラグの後、反映。

スプレッドシートを自動更新した図

やったね!

もし、カレンダーのオーナーが自分以外の人であるなどして、上記の設定で上手くいかない場合は、以下のように1時間おきに実行する設定にするか、

項目 設定内容
実行する関数を選択 outputCalendarEvents
実行するデプロイを選択 Head
イベントのソースを選択 時間主導型
時間ベースのトリガーのタイプを選択 時間ベースのタイマー
時間の間隔を選択(時間) (好きな間隔)
エラー通知設定 今すぐ通知を受け取る

以下のように決まった時間帯に実行する設定にしてください。

項目 設定内容
実行する関数を選択 outputCalendarEvents
実行するデプロイを選択 Head
イベントのソースを選択 時間主導型
時間ベースのトリガーのタイプを選択 日付ベースのタイマー
時刻を選択 (好きな時間帯)
エラー通知設定 今すぐ通知を受け取る

これでプログラムの作業は完了しました。

ちなみに、プログラムの実行状況は画面左端の [実行数] アイコンをクリックして開いたページから確認できます。

「実行数」画面の図

ログの図

スプレッドシートに数式を追加する

ここまでで、カレンダーの予定をスプレッドシートに転記することができました。次はそれぞれの予定までの日数を視覚化しましょう。

まず、スプレッドシートD1 セル、E1 セル、F1 セル、H1 セルに以下のように見出しを入力してください。

スプレッドシートに見出しを入力する図

次に、セルに以下の数式を入力してください。数式を入力するのは D2 セル、E2 セル、F2 セルの3か所のみです。

D2 セル

=ArrayFormula(IF(B2:B="","",INT(B2:B)-TODAY()))

E2 セル

=ArrayFormula(IF(B2:B="","",NETWORKDAYS(TODAY(),B2:B,H2:H)))

F2 セル

=ArrayFormula(IF(E2:E="","",IF(E2:E<0,"",REPT("|",E2:E))))

するとこのようになるはずです。

スプレッドシートに数式を入力した図

勤務先独自の祝日は、H2 セルから下に入力してください。

祝日を入力した図

数式の入力は完了です。

スプレッドシートの見た目を整える

ここまで作成したスプレッドシートのデータをスライドに貼り付けるわけですが、その前に少し表の見た目を整えましょう。

このセクションは単に見た目を整えるだけで、飛ばしてもシステム全体には何ら影響はありません。読まなくても自分でカスタマイズできる方や見た目に執着しない方は、「予定をスライドに貼り付ける」にお進みください。

日付の表示が長すぎるので、表示形式を変えましょう。開始日と終了日の B 列と C 列を選択してください。

B 列と C 列を選択した図

画面上部の [表示形式] をクリックし、[数字] > [カスタム数値形式] の順にクリックしてください。

[表示形式] > [数字] > [カスタム数値形式] の順にクリックした図

入力欄に MM/dd と入力し、[適用] をクリックしてください。

表示形式を入力した図

開始日と終了日の表示がすっきりしました。

日付の表示形式が変わった図

次に、全体的に中央寄せにしましょう。これはただの好みです。A 列から E 列までを範囲選択したあと、Ctrl キーを押したまま F1 セルをクリックしてください。その状態で画面上部の [水平方向の配置] > [中央] の順でクリックしてください。

[水平方向の配置] > [中央] の順でクリックする図

選択した箇所が中央寄せになりました。

中央寄せにした図

最後に、残りの平日の日数が少なくなった予定に色を付けましょう。A2 セルから F11 セルまでを範囲選択してください。

A2 セルから F11 セルまでを範囲選択した図

その状態で画面上部の [表示形式] > [条件付き書式] の順でクリックしてください。

[表示形式] > [条件付き書式] の順でクリックする図

画面右端に出てきたはずの [条件付き書式設定ルール] 画面で以下のように設定してください。

項目 内容
範囲に適用 A2:F11
セルの書式設定の条件... カスタム数式
値または数式 =$E2<6
書式設定のスタイル (バケツのアイコンで好きな色を選択する)

残りの平日が5日以下になった予定の行に色がついたはずです。

条件付き書式を設定する範囲や、色をつける日数は適宜変えてください。

これでスプレッドシートの作業は完了です。

予定をスライドに貼り付ける

Google のトップページGoogle カレンダーなどの画面右上にある点9個のボタン(キャンディボックス)をクリックして、アプリの一覧から「スライド」を探してクリックしてください。

Google スライドを開く図

左上にある「+」ボタン(空白と書いてあるやつ)をクリックしてください。そうすると新しいスライドが開きます。

「空白」をクリックする図

「無題のスライド」のままだと後から探すときに苦労しますので、真っ先にファイル名を付けましょう。今回は「イベントまでの日数」としました。

ファイル名を付ける図

今回は白紙のスライドを使いたいので、画面左端の一覧でスライドを右クリックして、[レイアウトを適用] > [空白] の順にクリックしてください。

スライドのレイアウトを変更する図

まっしろ。

スライドのレイアウトを変更した図

ではスプレッドシートのデータを貼り付けましょう。スプレッドシートに戻って、A1 セルから F11 セルまでを範囲選択してください。

A1 セルから F11 セルまでを範囲選択した図

そのままスライドに戻ってきて貼り付け (Ctrl + V) してください。

「表の貼り付け」という画面が出るはずです。[スプレッドシートにリンク] にチェックを入れて [貼り付け] をクリックしてください。

スライドに貼り付けする図

こうなるはずです。

スプレッドシートのデータをスライドに貼り付けた図

表の右上に鎖のアイコンがあるのが見えるでしょうか。これは「スプレッドシートのデータとリンクしていますよ」という意味です。スプレッドシートの方を更新すると、スライドの方も連動させることができます。

これで、「カレンダー→スプレッドシート→スライド」という連携ができました!

ただこれでは見た目があんまりなので、少し整えましょう。それで終わりです。

スライドの見た目を整える

このセクションは単に見た目を整えるだけで、飛ばしてもシステム全体には何ら影響はありません。読まなくても自分でカスタマイズできる方や見た目に執着しない方は、「スライドを更新する」にお進みください。

以下の点について見た目を整えます。

  • 表の配置を調整する
  • 行の高さや列の幅を揃える
  • 罫線を引く
  • 見ていて楽しくなるようにする

まずは表の大きさを整えましょう。表をクリックした状態で、周囲のグレーの線をマウスで引っ張って、丁度いいと思う大きさにしてください。

そうしたら、表を右クリックして [ページ中央に配置] > [左右] の順にクリックしてください。

[ページ中央に配置] > [左右] の順にクリックする図

表を水平方向に中央寄せできました。

表を水平方向に中央寄せした図

次に行の高さや列の幅を整えましょう。ただしその前に、行や列の境目が見にくいので罫線を引きます。

スプレッドシートのセルと同じ要領で、表のセルを全て範囲選択してください。そうすると選択部分の右上に「四角の中に▼」のボタンが現れるはずです。それをクリックして、出てきたアイコンの左上のものをクリックしてください。田んぼの田のやつです。

田んぼの田をクリックする図

全ての罫線が選択状態になりました。

全ての罫線が選択状態になった図

この状態で、画面上部の [枠線の色] をクリックし、出てきたカラーパレットで好きな色を選択してください。

[枠線の色] をクリックして好きな色を選択する図

罫線が入りました。これで行や列の境目が分かります。

罫線が入った図

見やすいように列の幅を調整しましょう。「イベント」列と「残り平日 (グラフ)」列は幅を広く取りたいので、それ以外の列を狭くしてください。列の境目にマウスを持って行って、罫線をクリックして動かせば調整できます。

大雑把に調整したら、

大雑把に調整した図

「開始日」列から「残り平日」列までを範囲選択して右クリックし、[列の幅を均等にする] をクリックしてください。

[列の幅を均等にする] をクリックする図

列の幅が揃いました。

列の幅が均等になった図

同様に、行の高さも均等にしましょう。表全体を範囲選択して右クリックし、[行の高さを均等にする] をクリックしてください。

[行の高さを均等にする] をクリックする図

行の高さも揃いました。

行の高さが均等になった図

これは好みですが(見た目に関しては全て好みですが)、行内で文字が下に寄っているのはなんとなく好きではないので、中央寄せにします。表全体を範囲選択した状態で、画面上部の [配置] > [中央(縦)] の順にクリックしてください。

[配置] > [中央(縦)] の順にクリックする図

行内で中央寄せできました。

行内で中央寄せにした図

罫線多すぎ!

縦の罫線は好みでないので消します。ここもお好みで。表全体を範囲選択して、「四角の中に▼」のボタンをクリックし、内側の縦の罫線のボタンをクリックしてください。罫線が選択状態になります。

縦の罫線を選択する図

その状態で画面上部の [枠線の色] > [透明] の順にクリックしてください。

[枠線の色] > [透明] の順にクリックする図

内側の縦の罫線が消えました。

内側の縦の罫線が消えた図

同様に外側の縦の罫線と、一番上の罫線も消します。これは好みです。

外側の縦の罫線と、一番上の罫線も消した図

それから、見出しの行を選択して太字にして、

見出しを太字にした図

見出しの下の罫線を選択して、

見出しの下の罫線を選択する図

太くして、

見出しの下の罫線を太くする図

色を濃くするのが私は好きです。

見出しの下の罫線の色を濃くする図

こうなるはずです。

罫線を整えた図

好きな言葉や画像で飾りましょう。やっぱり見たくなるような工夫がないとね。推しの画像とか貼りましょうよ。

好きな言葉や画像を貼り付けた図

冒頭にもあるように、Google スライドに GIF 画像を貼るとプレゼンテーション中にも動きます。テンションが上がりますね。

これで全工程が終了しました。お疲れ様でした!

ただし、利用する際にちょっとすることがあります。このまま読み進めてください。

スライドを更新する

ここまでで「カレンダー→スプレッドシート→スライド」の連携を構築しました。カレンダーに予定を入れる度にスプレッドシートに自動で転記するようにもなっています。ただし、スプレッドシートの内容をスライドに反映させるところは自動化できないようで、そこだけ手動です。

スプレッドシートのデータに変更があると、スライド上の予定表の右上に「更新」というボタンが出ます。

「更新」ボタンの図

これをクリックすると更新できます。

表を更新した図

どうやらこの手順は自動化できそうにありませんので、カレンダーに予定を追加したら「更新」ボタンをクリックしてください。注意していただきたいのが、スライドショー中は「更新」ボタンが表示されないという点です。たまにスライドショーを中断して更新を確認してください。

結び

3回にわたって Google のアプリで予定やタスクを管理する話をしてきました。これで優先順位を考えて効率的かつ漏れなく仕事ができるといいなと思います。

予定やタスクがなくなればもっといいのになと思います。

参考