Google Apps Scriptという仕組みがあります。
「Googleでの作業を自動化する」というようなことができます。
次のサイトで概要を知ることができます。
Google Apps Script入門 (全16回) – プログラミングならドットインストール
この仕組みを使ってGoogleドライブのGoogleドライブのスプレッドシートにセットしたスケジュール表をGoogleカレンダーにインポートする方法を紹介します。
手順
- Google Driveを開く。
- 「
作成新規」をクリックしてスプレッドシートを選択。 - スプレッドシートで「Subject、Start、End、Location」を見出しとするスケジュール表を作る。※見出しは「予定、開始、終了、場所」でもよい。
- ツール-スクリプトエディタ を選択。
- ダイアログで「空のプロジェクト」を選択。
- コードに後述の「createEventFromSheet」を貼り付ける。メニューの ファイル – 保存 を選択しプロジェクトを保存する。
スプレッドシートに戻り、ツール-スクリプトマネージャを選択。メニューの 実行 を選択。- 「createEventFromSheet」を選択
して実行。
途中で保存や認証などの確認ダイアログが出るかもしれません。
正しく動作すれば自分のGoogleカレンダーに予定が追加されます。ちょっと動作が遅いかもしれませんが待ってください。
スプレッドシート
スケジュール表は次のように作ります。
1行目は見出しです。
2行目以降に予定をセットします。
開始日時は日付と時刻を一つのセルに入れてください。終了日時も同様です。
コード
コードは次の通りです。
JavaScriptなので分かる人は改造も容易でしょう。
function createEventFromSheet() {
var sheet, i, myevent, mystart, myend, mylocation;
sheet = SpreadsheetApp.getActiveSheet();
for(i = 2; i <= sheet.getLastRow(); i++) {
myevent = sheet.getRange(i, 1)
.getValue();
mystart = sheet.getRange(i, 2)
.getValue();
myend = sheet.getRange(i, 3)
.getValue();
mylocation = sheet.getRange(i, 4)
.getValue();
CalendarApp.getDefaultCalendar()
.createEvent(myevent, mystart, myend, {
location: mylocation
});
}
}
var sheet, i, myevent, mystart, myend, mylocation;
sheet = SpreadsheetApp.getActiveSheet();
for(i = 2; i <= sheet.getLastRow(); i++) {
myevent = sheet.getRange(i, 1)
.getValue();
mystart = sheet.getRange(i, 2)
.getValue();
myend = sheet.getRange(i, 3)
.getValue();
mylocation = sheet.getRange(i, 4)
.getValue();
CalendarApp.getDefaultCalendar()
.createEvent(myevent, mystart, myend, {
location: mylocation
});
}
}
カレンダーを指定する方法
(2015年5月13日追記)
上のコードではデフォルトのカレンダーにインポートされます。
複数のカレンダーを使っている場合、任意のカレンダーにインポートするためにはカレンダーIDを指定する必要があります。
まずカレンダーIDを探します。
- Googleカレンダーの右上にある 設定アイコン(歯車) をクリック。
- 設定 を選択。
- カレンダー設定 の下の カレンダー を選択。
- インポート先のカレンダーを選択。
- 「カレンダーのアドレス:」 にある カレンダーID「xxxxx@group.calendar.google.com」を探す。※「xxxxx」の部分は半角英数字。
コードは
「CalendarApp.getDefaultCalendar()」
の部分を
「CalendarApp.getCalendarById(“xxxxx@group.calendar.google.com”)
に書き換えます。
コメント
質問です。
グーグルカレンダーに“説明”と“終日”を追加したいのでDiscreptionとAll day Eventのスクリプトはどのように書けば宜しいでしょうか?Calender appの所でLocationと他の記述が変わっているので素人な私ではどのように表記して良いかわかりません。
スクリプトの表記をお教え頂けないでしょうか?
[…] 以前、「GoogleスプレッドシートからGoogleカレンダーにインポート」という記事を書きました。 コメントで「終日データをインポートする方法を教えろ」というリクエストをいただきましたので、調べてみました。 […]
>セゾンさん
説明すると長くなるので別の記事を書いてみました。
http://stabucky.com/wp/archives/6182
ご不明な点があれば、またコメント下さい。
スクリプトを保存し、スプレッドシートに戻ってもスクリプトマネージャーという項目が表示されません。なぜでしょうか。
宜しくお願いします。
>mmmさん
仕様が変わったようです。本文を書き直しました。
スクリプトを保存した後、スプレッドシートに戻らず、メニューの実行を選択してみてください。
stabuckyさん、ありがとうございました。
試してみたのですが、「メソッド createEvent(string,string,string,object) が見つかりません。」というメッセージが表示されてしまいました。
会社のパソコンで作業しているのですが、社内システム(セキュリティー)で使用できないということはあるのでしょうか?
それとも私のやり方が間違っているのでしょか?
度々すみません。
宜しくお願いします。
>mmmさん
「メソッド createEvent(string,string,string,object) が見つかりません。」というエラーメッセージは、例えば空のレコードを与えると発生します。
紹介したコードでは、2行目から最後の行まで処理するので、例えば2行目が空だとエラーになります。完全に空でなくとも、開始日時または終了日時が空だとエラーになるようです。
また「getLastRow()」は値がセットされたセルのうち最も下にある行を取得するので、スケジュール表の下に余計な値がセットされたセルがあるとそのセルまで処理します。その上の行が空だとやはりエラーになります。
>stabuckyさん
ありがとうございます。
もう一度確認してみたら無事、実行できました。
時間の:が大文字になっていたのが原因だったみたいです。
お騒がせしました。
さらに質問なのですが、同期するカレンダーを別のマイカレンダーに指定しすることはできますでしょうか?
よろしくお願いします。
>mmmさん
getCalendarByIdを使うことでカレンダーを指定することができます。
具体的な方法を本文に追記しましたので参考にしてください。
>stabuckyさん
ありがとうございます。設定できました。
すみません。もう一つ質問が。。。
トリガー機能を使用して、スプレッドシートに追記されたら更新するようにしているのですが、更新するごとに追記される前のものまでカレンダーに追加されてしまうので、更新する度に同じ予定が増えてしまいます。これを追記したもののみにしたい時はどうすればよいでしょうか?
よろしくお願いします。
ご認識の通りこの仕組みではどんどん追加されてしまいます。同期ではなくインポートなのです。もしやるならば追加済みの行に「済」とセットし次回以降はこの行は処理をスキップする方法が考えられます。また追加済みのイベントを削除したり変更したりする方法は見つかりませんでした。
>stabuckyさん
ありがとうございます。
スキップするスクリプトを探して挑戦してみたいと思います。。。
>mmmさん
重複防止の記事を書いてみました。参考にしてください。
http://stabucky.com/wp/archives/7247
stabucky 様
「メソッド createEvent(string,string,string,object) が見つかりません。」が出ます。
また、複数の登録を試しましたが、最初の1個しか登録されず(カレンダーには登録されているが、完了は付かない)
上記のエラーが発生します。
空のデータということでしたので、完了は付かないですが、登録出来る1行目を2行目以降に丸ごとコピーしていますが
同様です。
>Copenさん
データが空でないとすると原因が分かりません。
ところで「完了」とは何でしょうか?
stabucky 様
完了の件については
他のものと勘違いしていました。
申し訳ありません。
[…] Apps Scriptの基本的な使い方は「GoogleスプレッドシートからGoogleカレンダーにインポート」を参考にしてください。 […]
stabucky様
質問です。
同じイベント内で複数の期限を設けている場合はどのようにつくればよいのでしょうか。
例としては下記例です。
それぞれの日付毎に「イベントA 作成期限」「イベントA 発送期限」のように表示したいのです。
例:
イベントA 作成期限 発送期限 到着日 申請期限
>moonさん
Subjectに「イベントA(作成期限)」「イベントA(発送期限)」として行をそれぞれ作る方法が考えられます。
表を変更しないならばコードを書き換える必要がありますが結構面倒です。
stabucky様
お返事が遅くなってしまい申し訳ありません。
ご回答いただきありがとうございます。
できれば表は変更したくないのですが、
やはりそれぞれに行を作成する必要があるんですね。。。
このままのに表でのコードを作成する技術がないのであきらめます。。。
ありがとうございました。