GAS(Google Apps Script)を使ってGoogleスプレッドシートで作成したスケジュールをGoogleカレンダーに追加する仕組みを考えましたので備忘記録として記事にしておきます。
主な使い道としては、税理士業務などで完了したタスクなどをGoogleカレンダーへ記録しておくために使えるのではないかと考えています。
スプレッドシートに終了したタスクを入力すると自動でGoogleカレンダーへ登録されますので後でカレンダーを見返した際にタスクを俯瞰することができるようになります。
Googleスプレッドシートに記載されたスケジュールをGoogleカレンダーへ追加するGAS(Google Apps Script)の概要
ネットで検索するとGoogleカレンダーに登録されたスケジュールのデータをGoogleスプレッドシートへ転記するGASに関する記事はよく見つかるんですが、
逆のパターン。つまり、Googleスプレッドシートに記載したスケジュールをGoogleカレンダーへスケジュール登録する記事があまりみつけることができなかったのでネットの記事を参考にしながら自分で考えてみることにしました。
今回やりたいことですが、GoogleスプレッドシートのA列にデータを入力するとその入力した内容がGoogleカレンダーへ登録されるというものです。
なお、登録される時間帯はスプレッドシートのA列にデータを入力した時間でGoogleカレンダーへ登録されます。

動画をみていただくとイメージがつかめると思います↓
Googleスプレッドシートに記載されたスケジュールをGoogleカレンダーへ追加するGAS(Google Apps Script)
今回はシンプルに下記のような形式でスプレッドシートのデータを準備しました↓
A列にのみデータを入力します。B列とC列に関してはGASが実行された際に自動で記載されます。

で、肝心のGASはこんな感じで作ってみました↓
何か無駄にコードを書いている気がするんですがその辺は無視しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | function myFunction() { //■変数宣言 let sheet = SpreadsheetApp.getActiveSheet(); //アクティブなスプレッドシートを取得 let lastrow = sheet.getRange(sheet.getMaxRows(),1).getNextDataCell(SpreadsheetApp.Direction.UP).getRow(); //A列の最終行を取得する //■エラー処理 もし最終行が「1」だったら処理の実行を終了する if (lastrow<2){ Browser.msgBox( "A列にデータを記載してください" ); return ; } //■処理実行部分 sheet.getRange(lastrow,2).setValue( new Date()); //B列に現在の日付データを追加する for ( let i=2;i<=lastrow;i++){ if (sheet.getRange(i,3).getValue()=== "" ){ const CALENDAR_ID = "※ここにGoogleカレンダーのIDを記載する※" ; //カレンダーID const calendar = CalendarApp.getCalendarById(CALENDAR_ID); const title = sheet.getRange(i,1).getValue(); //A列のデータを格納する const startTime = new Date(sheet.getRange(i,2).getValue()); //B列の日付データを格納する(Googleカレンダーへ登録する開始時間) const endTime = startTime; //Googleカレンダーへ登録する終了時間 calendar.createEvent(title, startTime, endTime, ); //カレンダーへ登録する //C列のセルに「転記済み」と記載する。 sheet.getRange(i,3).setValue( "転記済み" ); } } } |
ざっくりとした処理の流れとしてはこんな感じでしょうか。
- スプレッドシートを取得して、最終行を変数lastrowに格納する
- 最終行が1以下の場合(A列に何もデータが無い場合)にはそれ以降のGASを実行しない
- 最終行が2以上の場合には引き続きGASを実行する
- B列に日付のデータを入力する
- C列が空欄ならGoogleカレンダーへ登録する
- C列に「転記済み」と記載する
Googleスプレッドシートに記載されたスケジュールをGoogleカレンダーへ追加するGAS(Google Apps Script)のざっくりとした内容説明
今回作成したGASのスクリプトで使用している
- 「最終行の取得方法(変数lastrow)」
- 「for」
- 「if」
の考えかた・使い方については以前記事にしているのでこの部分に関しては今回は説明は割愛します。
なのでそれ以外の部分について自分なりに説明をしておこうと思います。(完全に理解しているわけではありませんので間違っている点もあると思います。)
まずGoogleカレンダーにスケジュール(イベント)登録をするためには下記のルールにしたがってデータを作成する必要があります。

GoogleカレンダーのID取得
Googleカレンダーへ登録するにはまずGoogleカレンダーのIDをGASに記載する必要があります。
これをしないとGASでGoogleカレンダーを操作できません。
今回は「業務管理関係」というカレンダー新たに追加作成したので、このIDを取得していきます。
まずは「設定と共有」をクリックします。

次に「カレンダーの統合」をクリック

すると画面がスクロールして右側にカレンダーのIDが表示されている場所がありますのでその部分のIDをコピーするかメモ帳などに一時的に記録しておきましょう。
これでGoogleカレンダーのIDの取得が完了しました。
下記の部分25行目に取得したIDを入力しておきましょう。

Googleカレンダーに登録するイベントのタイトルを取得する
カレンダーのIDが取得できたら次にカレンダーに登録するイベントのタイトルのデータを取得します。
タイトルはA列に記載していますのでここからデータを取得していきます↓

この部分です↓

定数「title」を宣言しておいてgetRange()とgetValue()を使ってA列のデータを取得します。
Googleカレンダーへ登録する時間帯を取得する
上でも書きましたがGoogleカレンダーにスケジュール(イベント)を登録するにはイベントの開始時間と終了時間を指定する必要があるようです。

今回のケースの場合、実際のスケジュールを登録するのではなく、完了したタスクを記録していく目的のため、開始時間と終了時間に関しては同じ時刻でも問題ないです。
なので、開始時間を取得することができれば時間の設定に関してはOKということになります。
開始時間のデータに関してはB列に記載されるようになっていますのでここから開始時間のデータを取得していきます↓

この部分です↓

定数「starTime」と定数「endTime」を宣言して「startTime」にはB列に記載された日付のデータを格納して、「endTime」にも同じ時刻を格納しています。
トリガーの設定をする
最後にトリガーを設定して完成になります。
今回はスプレッドにデータが追加された都度GASを実行したいと思いましたので、トリガーの種類を「スプレッドシート」にして「変更時」に設定しました↓

こうすることでスプレッドシートに何か変更が加えられた瞬間にGASが実行されるようになります。
例えばD列などのA列以外のセルに何かデータが記載されてもGASが実行されるのですが、この場合には下記の画像にもあるようにエラー処理によってそれ以上はGASが実行されないようにしているので問題はないかと思います。

通常はA列にデータが追加されるだけだと思いますので結果的にA列にデータが追加されるとGASが実行されGoogleカレンダーへ登録されるということになります。
今回のGASのデータ入力時に注意する事項(バグ)について
今回のGASですが、A列にのみデータを入力すればよいのですが、作った現時点で確認しているだけでもバグが1つがります。
A列に上から順に連続してデータ入力する場合には問題ないのですが、連続してデータをA列に入力しなかった場合、下の画像でいうとA5セルに入力せずに、ひとつ飛ばしたセル、A6セルに入力した場合にはエラーになると思います。(試していないのでわかりませんが)

なのでこのGASを使用する際には連続してA列にデータを記載するように注意しないといけません。
この部分に関してGASを書き換えればいいのですが記事作成時点ではアイデアが思いつきません。。。
まとめ
GAS(Google Apps Script)を使ってGoogleスプレッドシートで作成したスケジュールをGoogleカレンダーに追加する仕組みを考えました。
本来のGoogleカレンダーの使い方としては違うかもしれませんが、こういった使い方もあるってことで記事にしてみました。
todoistなどのタスク管理アプリから処理済みのタスクデータをifttt(イフト)などのサービスを連携してスプレッドシートへ飛ばし、その飛ばしたデータをさらにGoogleカレンダーへ登録する際にも同様の考え方を使えば実現可能かと思います。多分。
【本日の近況報告】
仕事で使っている税務ソフトの会社の営業の方と数カ月ぶりにお会いして業界の情報提供を受けました。
関東の税理士さんで、その方と従業員1名のみで顧問先80件を担当しているそうです。
そのうち4割は自社で経理をされているとのことですが、単純計算で残りの6割は記帳の業務をうけていることになります。余計なお世話ですが、自分や従業員の人が入院とかしたどうするんでしょうか?
羨ましいと思いますが、自分や従業員の入院や退職等のリスクを考えると怖すぎるというのが正直なところで、自分にとっては現実的ではないなという感想でした。
【本日の1曲】
Stiff Little Fingers / Roots Radicals Rockers and Reggae
アイルランドのパンクバンド、スティフリトルフィンガーズの3枚目のアルバムの1曲目。曲自体はカバー曲のようで、オリジナルはバニー・ウェイラーというレゲエの人の曲。この人、ボブマーリーアンドザウェイラーズのオリジナルメンバーだそうで、オリジナルもいい曲です。
正直、スティフリトルフィンガーズと言えばパンクのアルバムとして1枚目のアルバムが有名で、自分もそれしか聴いていなかったんですが、このバンド、レゲエの曲もたまにやったりしてるんですよね。
このアルバムも聴いてみたら普通にイイじゃん。ということで最近聴いています。
ランシドの曲に似たような感じの曲があったような気がするんですが、思い出せません。
気のせいかな。。。