こちらのサンプルプログラムは Java 9 以降では動作しません。
Garoon と Google Calendar とを連携させたい場合は、株式会社ノベルワークスのカレンダー連携ソリューション ガル助(有償)の利用をご検討ください。
本サンプルプログラムとの大きな違いは次のとおりです。
・Google Calendar だけでなく、Office 365 とも連携が可能
・双方向連携が可能
・複数ユーザーのスケジュール同期が可能
(著者:サイボウズ 竹内 能彦)
はじめに
Googleカレンダー使っていますか?自分の予定と他の方の予定を並べて表示したり、予定を共有したり出来てとっても便利ですよね。
そこにGaroonの予定を並べて見られたらもっと便利になると思いませんか?
そんな思い付きからGaroonの予定をGoogleカレンダーに表示する連携プログラムを作成しました。事前準備が少し大変ですが、皆さん是非使ってみてください。
概要
連携プログラムは以下の処理をコマンドラインから実行できるサンプルプログラムです。
- Garoonに登録された予定をGoogleカレンダーに登録
- Garoonで更新された予定をGoogleカレンダーに反映
- Garoonから削除された予定をGoogleカレンダーから削除
Googleカレンダーに登録する情報はGaroonの予定の「開始日時」、「終了日時」、「施設」、「メモ」、「コメント」、「参加者」です。
動作環境
- プログラム実行用端末(Java8が動作し、Garoon、Googleカレンダーにネットワーク接続できること)
2018年3月現在、Java9では動作しないことを確認しています。 - Garoon on cybozu、パッケージ版 サイボウズ ガルーン3.0.0以降
- Googleカレンダー
Garoon on cybozu、Googleカレンダーは2018年2月版で確認しています。
事前準備
実行するには連携プログラムの設定だけでなく、GoogleアカウントやGoogleカレンダーの設定が必要になります。
また、GoogleアカウントやGoogleカレンダーの設定内容を連携プログラムの設定に利用するため、メモが必要な項目はその都度注釈を入れてあります。
※現在のGGsyncはOAuth2.0にも対応していますが、本ページではサービスアカウントキー認証を利用します。
1.Googleアカウント作成
下記URLから、Googleアカウントを作成します。Googleアカウントを取得済みの方はログインしてください。
https://accounts.google.com/SignUp
2.Google APIの利用設定
下記URLから、プロジェクトを作成します。
https://console.developers.google.com/project
プロジェクト名には適当な値を入力してください。
プロジェクトの作成完了後、Google Calendar APIを検索し、
Google Calendar APIを有効にします。
認証情報を作成します。
下記画像の通りの内容を選択し、「必要な認証情報」をクリックします。
サービスアカウント名には適当な値を入力し、キーのタイプはP12を選択します。
役割なしで作成します。
自動ダウンロードされたP12キー(以下、秘密鍵(拡張子がp12))は以降の手順で利用しますので任意のフォルダに保存します。
次にサービスアカウント IDを確認します。
画面右の「サービスアカウントの管理」をクリックし、
表示されたサービスアカウント IDをメモします。(以降の手順で利用します)
3.Googleカレンダーの作成
下記URLから、Garoonのスケジュールを連携させるGoogleカレンダーを作成します。
https://www.google.com/calendar
カレンダーの作成完了後、Googleカレンダー設定の「このカレンダーを共有」タブを開きます。先ほどのメールアドレスに予定の変更権限を付与し、保存します。
Googleカレンダー設定の「カレンダー情報」タブを開き、カレンダーIDを確認します。カレンダーIDは以降の手順で利用しますのでメモしてください。
4.連携プログラムの設定
プログラム実行用端末に連携プログラムを動作させるフォルダを作成します。本設定では例として「C:/GGsync」を利用します。
秘密鍵を「C:/GGsync」に移動します。
実行ファイルと設定ファイルをダウンロードしてください。ソースはGitHubで管理しています。(外部サイトが開きます)
実行ファイル「GGsync.jar」と設定ファイル「GGsync.properties」を「C:/GGsync」に移動します。
設定ファイル「GGsync.properties」をテキストエディタで開き、コメントに従い設定します。
Googleカレンダーに登録する予定の色は1から11までの数値を指定できます。下記の色を参考に選択してください。
各カラーIDのカラーコードはこちらのコメントから確認できます。
(tomomo85さん 情報ありがとうございます)
実行手順
プログラム実行用端末でコマンドプロンプトを起動し、以下のコマンドを入力します。
> java -jar C:/GGsync/GGsync.jar C:/GGsync
コマンドの形式は「 java -jar 実行ファイルのパス 設定ファイルが存在するフォルダ」です。
「The sync completed.」と表示されればスケジュール連携に成功しています。
実行結果は設定ファイルが存在するフォルダ配下のGGsync.db(例ではC:/GGsync/GGsync.db)に保存します。GGsync.dbは次回実行時の差分反映に利用します。
プロキシ経由の実行
プロキシを経由する必要がある場合は下記のオプションを追加して実行してください。
> java -Dhttp.proxyHost=ホスト名 -Dhttp.proxyPort=ポート番号 -Dhttps.proxyHost=ホスト名 -Dhttps.proxyPort=ポート番号 -jar C:/GGsync/GGsync.jar C:/GGsync
オプションの詳細はこちら(Oracle社のドキュメントページが開きます)
セキュアアクセス利用時の実行
セキュアアクセスを利用する必要がある場合は、クライアント証明書をGGsync.jarと同じディレクトリに保存し、下記のオプションを追加して実行してください。
> java -Djavax.net.ssl.keyStore=xxxx.pfx -Djavax.net.ssl.keyStorePassword=xxxx -Djavax.net.ssl.keyStoreType=PKCS12 -jar GGsync.jar .
実行例
下記がGaroonのスケジュール、実行結果、予定が反映されたGoogleカレンダーの例になります。
・Garoonのスケジュール
・連携プログラムの実行結果
・Googleカレンダー(プライベートな予定と並べて表示)
Garoonの予定の「メモ」、「コメント」はGoogleカレンダーの「説明」にまとめて登録します。
Garoonの予定が変更された場合は、Googleカレンダーの予定を削除してから再登録します。
下記が変更時の実行例になります。
Garoonの予定が削除された場合は、Googleカレンダーの予定を削除します。
下記が削除時の実行例になります。
定期実行
タスクスケジューラなどを利用することで、定期的にGaroonの予定をGoogleカレンダーに反映できます。
是非試してみてください。
連携プログラムの更新履歴
2015/3/30 繰り返し予定が正常に登録されない不具合を改修しました。
2015/4/24 終了時間未指定の予定がエラーになる不具合を改修しました。
2015/6/18 連携失敗時に詳細なエラーを出力するように修正しました。
2015/9/16 日本語文字のアカウント名に対応しました。
2016/1/14 Googleカレンダーに「参加者」を登録する機能を追加しました。
2016/3/24 ソースコードをGitHubに移しました。
2017/3/21 セキュアアクセス利用時の実行オプションを追記しました。
2017/9/21 ソースコードにライセンス表記を追加しました。
ゆうき様
どこかのタイミングでOauth2認証が動作しなくなったのかもしれません。
p12keyでお試しいただけますでしょうか。
竹内様
お世話になります。
すみません、google.oauth.p12keyのパス誤りでした。
正しいものに直したところ正常に同期がされました。
お手数をおかけいたしました。
おー良かったです :D
iPhoneのカレンダーと連携させて便利に利用しています。
Windows7 64bit JAVA jdk-8u171-windows-x64 では
連携できますが、 Windows7 32bit jdk-8u171-windows-i586を使うと
エラーになってします。考えれる原因はございますでしょうか?
INFO 2018/07/18 17:09:36(GGsync:main:83) The sync beginning with normal mode.
INFO 2018/07/18 17:09:40(GGsync:main:393) [ADD] Title:その他:
ERROR 2018/07/18 17:09:42(GGsync:main:449) Connection refused: connect
java.net.ConnectException: Connection refused: connect
塚田さん
32bit版でも動作すると思うのですが確認はしていません。
恐れ入りますが、64bit版での利用をご検討ください。
お世話になります。
2015年11月13日 16:52にRICK DOM様が同事象を記載しているのですが、
最近になって以下エラーにより連携処理が実行されません。
C:\GGsync>java -Djsse.enableSNIExtension=false -jar C:\GGsync\GGsync.jar C:\GGsync
INFO 08:53:20 The sync beginning with normal mode.
8 17, 2018 8:53:47 午前 org.apache.commons.httpclient.HttpMethodDirector executeWithRetry
情報: I/O exception (java.net.ConnectException) caught when processing request: Connection timed out: connect
8 17, 2018 8:53:47 午前 org.apache.commons.httpclient.HttpMethodDirector executeWithRetry
情報: Retrying request
INFO 08:54:10 [DEL for deleted garoon schedule] GoogleId:*************
ERROR 08:54:12 410 Gone
{
"code" : 410,
"errors" : [ {
"domain" : "global",
"message" : "Resource has been deleted",
"reason" : "deleted"
} ],
"message" : "Resource has been deleted"
}
com.google.api.client.googleapis.json.GoogleJsonResponseException: 410 Gone
{
過去ログを見る限り解決手法等が記載されていないと思うのですが、
解決方法等わかりましたら教えて頂けないでしょうか?
ゆうきさん
連携したGoogleカレンダー側の予定が削除されていないでしょうか。
2016年3月にGoogleカレンダー側の予定が削除されていても
処理は継続するようにプログラムを変更しました。
GGsync.jarの更新(上書き)もご検討ください。
竹内様
御返事ありがとうございます。
頂いたようにGGsync.jarを更新することで問題なく同期が実行されました。
ありがとうございます。
お世話になります。
設定していたところ、下記のようなエラーが出てしまいました。
原因がわかりましたら、教えていただけないでしょうか。
C:\Users\xxxxx>java -Dhttp.nonProxyHosts -Dhttps.proxyHost=xxxxx -Dhttps.proxyPort=xxxxx -jar C:/GGsync/GGsync.jar C:/GGsync
INFO 16:54:03 The sync beginning with normal mode.
INFO 16:54:14 [ADD] Title: xxxxxx
ERROR 16:54:15 accounts.google.com
java.net.UnknownHostException: accounts.google.com
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:184)
meiさん
Garoonのスケジュール情報は取得できていますがGoogleカレンダーへの登録に失敗していそうですね。
以下が疑わしい点なのでご確認よろしくお願いします。
・エラー「UnknownHostException」
=> プロキシ設定、DNSに問題が無いかご確認ください。
・エラー「ERROR 16:54:15 accounts.google.com」
=> 設定ファイル「GGsync.properties」で指定する認証方式はP12KEYですよね。
おそらくそうだと思いますが、P12KEYになっているか確認してください。
昨日PCを入れ替えました。一昨日まで問題なく使えていましたが、SYNCの設定を
バックアップし忘れたため、再設定しようとしております。
しかし、Googleカレンダーの設定画面が(最近?)変わったらしく、説明通りに
できません。
大変恐縮ですが、説明の内容を更新していただけないでしょうか?
もうこれがないと生きていけません。
T2さん
記事の内容が古くなり申し訳ありません。
今は更新時間が取れないので、取り急ぎコメントで回答させていただきます。
本文記事の項目「2.Google APIの利用設定」がわからないということで合っていますでしょうか。
であれば、以下をお試しください。もし他の箇所でしたら教えてください。
下記にアクセス
https://console.developers.google.com/cloud-resource-manager
おそらく以前作成したプロジェクトが表示されるはずなので、「プロジェクト名」をクリック
左メニューから「サービスアカウント」をクリック
上部の「+サービスアカウントを作成」をクリック
「サービスアカウント名」、「サービスアカウントの説明」に適当な内容を入力し、「作成」をクリック
役割は選択せずに「続行」をクリック
「+キーを作成」をクリック、「P12」を選択し「作成」をクリック、閉じるをクリック
※ここでダウンロードされたファイルが記事本文の秘密鍵
完了をクリック
※ここで表示されたメール(形式はxxxx@xxxxx.iam.gserviceaccount.com)が記事本文のサービスアカウントID
あとGGsync.dbも消えてしまった場合はカレンダーを新しく用意する必要があります。
(連携済みの情報がないので、連携済みの予定が重複登録されます)
竹内様
ありがとうございます。闘って何とか復活しました。
良かったです。(時間がかかったようで案内に誤りがあったのかもしれません。申し訳ないです)
こんにちは、
こちら手順どおりに実装したところ、正しく連携することができました。
素晴らしい記事をありがとうございます。
一点、質問です。
4.連携プログラムの設定
設定ファイルの編集方法について説明している箇所で、
唐突に「Googleカレンダーに登録する予定の色」についての解説がありますが、
カラーIDは「GGsync.properties」の中で設定するのでしょうか?
数値を指定する項目がありません。
tomomo85さん
設定ファイルから設定項目が抜けていました。申し訳ありません。
GGsync.propertiesに下記を追加してください。
「5」や「7」の数字はお好きな数字に変更してください。
# グーグルカレンダーに登録する通常予定の色
google.calendar.normal.color=5
# グーグルカレンダーに登録する期間予定の色
google.calendar.banner.color=7
メモ)本文のファイルにも追記済みです。
竹内 能彦さん
予定に色が反映されるのを確認しました、回答・対応ありがとうございました。
お礼に、他の方の参考までに色名メモ置いときます。
tomomo85 さん
良かったです!
カラーコード情報ありがとうございますm(_ _)m
本文に追記しました。
このようなエラーが出るのですが、お力添えいただけませんでしょうか?
弊社環境はBasic認証が設定されており、そのせいではと思っております。
```
➜ ggsync java -jar GGsync.jar .
INFO 17:05:48 The sync beginning with normal mode.
12 04, 2018 5:06:49 午後 org.apache.axis2.transport.http.HTTPSender sendViaPost
情報: Unable to sendViaPost to url[http://xxx/cgi-bin/cbgrn/grn.cgi/cbpapi/base/api]
org.apache.commons.httpclient.ConnectTimeoutException: The host did not accept the connection within timeout of 60000 ms
at org.apache.commons.httpclient.protocol.ReflectionSocketFactory.createSocket(ReflectionSocketFactory.java:155)
at org.apache.commons.httpclient.protocol.DefaultProtocolSocketFactory.createSocket(DefaultProtocolSocketFactory.java:125)
at org.apache.commons.httpclient.HttpConnection.open(HttpConnection.java:707)
at org.apache.commons.httpclient.MultiThreadedHttpConnectionManager$HttpConnectionAdapter.open(MultiThreadedHttpConnectionManager.java:1361)
at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:387)
at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:171)
at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:397)
at org.apache.axis2.transport.http.AbstractHTTPSender.executeMethod(AbstractHTTPSender.java:621)
at org.apache.axis2.transport.http.HTTPSender.sendViaPost(HTTPSender.java:193)
at org.apache.axis2.transport.http.HTTPSender.send(HTTPSender.java:75)
at org.apache.axis2.transport.http.CommonsHTTPTransportSender.writeMessageWithCommons(CommonsHTTPTransportSender.java:396)
at org.apache.axis2.transport.http.CommonsHTTPTransportSender.invoke(CommonsHTTPTransportSender.java:223)
at org.apache.axis2.engine.AxisEngine.send(AxisEngine.java:443)
at org.apache.axis2.description.OutInAxisOperationClient.send(OutInAxisOperation.java:406)
at org.apache.axis2.description.OutInAxisOperationClient.executeImpl(OutInAxisOperation.java:229)
at org.apache.axis2.client.OperationClient.execute(OperationClient.java:165)
at org.apache.axis2.client.ServiceClient.sendReceive(ServiceClient.java:555)
at org.apache.axis2.client.ServiceClient.sendReceive(ServiceClient.java:531)
at com.cybozu.garoon3.common.CBServiceClient.sendReceive(CBServiceClient.java:178)
at com.cybozu.GGsync.main(GGsync.java:168)
Caused by: java.net.SocketTimeoutException: connect timed out
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:589)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.commons.httpclient.protocol.ReflectionSocketFactory.createSocket(ReflectionSocketFactory.java:140)
... 19 more
ERROR 17:06:49 The host did not accept the connection within timeout of 60000 ms
org.apache.axis2.AxisFault: The host did not accept the connection within timeout of 60000 ms
```
DKさん
Basic認証はできれば追加したいと思っていますが、Basic認証がエラーではない可能性があるので念のため確認させてください。
・利用中のガルーンはオンプレガルーン(クラウドではない)でしょうか。接続先が以下のためオンプレだと考えています。
> http://xxx/cgi-bin/cbgrn/grn.cgi
・(上記が正しい=オンプレの場合)
Webサーバーの設定を変更してBasic認証を設定しているということで合っていますか。
タイムアウトエラーになっていることからBasic認証エラーではなく、URLの記載ミスも可能性がありそうです。
ガルーンで全社員が作成するイベントをGoogleに同期して、そこからZoom Roomsのスケジュールに同期したいと思っています。
GGsyncを使って正常に個人のスケジュールをGoogleカレンダーに同期することは出来ましたが、
個人のスケジュールだけではなくて、施設が登録されているイベントを全部同期することって可能でしょうか?
Adam Kendall さん
今のGGsyncではできません。
SOAP API、REST APIともに施設のスケジュールは取得できるので
GitHubに公開しているソースを修正できれば可能です。
SOAP API
https://developer.cybozu.io/hc/ja/articles/202463180#step4
REST API
https://developer.cybozu.io/hc/ja/articles/360000440583#step2
竹内さん、
ありがとうございます!出来ました。
Githubでフォークして、以下のREADME.MDでやり方をまとめました(英語):
https://github.com/adamkendall1/garoon-google-zoom-rooms
すごく適当で、効率の悪い方法ですが、ガルーンにある施設のスケジュールが全部Zoom Roomsのスケジュールにちゃんと同期されます。
もし同じことがしたい方がいたらどうぞご覧ください。
GGsyncをGithubにオープンソースで公開してくれてありがとうございます!助かりました。
おおお!さすがです。すごい!
竹内さん
以下の件、ありがとうございました
>Basic認証はできれば追加したいと思っていますが、Basic認証がエラーではない可能性があるので念のため確認させてください。
>・利用中のガルーンはオンプレガルーン(クラウドではない)でしょうか。接続先が以下のためオンプレだと考えています。
> > http://xxx/cgi-bin/cbgrn/grn.cgi
>・(上記が正しい=オンプレの場合)
> Webサーバーの設定を変更してBasic認証を設定しているということで合っていますか。
久しぶりに挑戦しました。
httpをhttpsにしたら実行できました。(https://xxx/cgi-bin/cbgrn/grn.cgi)
ありがとうございました!
改めてご質問させてください。
やはり社内ネットワークから出ると、Basic認証でエラーとなるようです。
普段社外からGaroonを見るときにはBasic認証を使っています。
こちら軽く調べてみたのですが、REST APIへの書き換えが必要なのでしょうか?
DKさん
動作したのですね。良かったです。
> こちら軽く調べてみたのですが、REST APIへの書き換えが必要なのでしょうか?
REST APIへの書き換えは必要ありません。
ガルーンへのリクエストにBASIC認証の認証情報を付与する改修が必要になります。
恐れ入りますが現時点では改修時期をお約束できないです。
そのため社内からご利用いただければと思います。すいません。
竹内さん:
お世話になります。
GGsyncを見つけて試してみました。
でも、使う時はエラーになりました。
INFO 2019/05/06 09:23:59(GGsync:main:83) The sync beginning with normal mode.
ERROR 2019/05/06 09:24:03(GGsync:main:449) Transport error: 301 Error: Moved Permanently
org.apache.axis2.AxisFault: Transport error: 301 Error: Moved Permanently
at org.apache.axis2.transport.http.HTTPSender.handleResponse(HTTPSender.java:310)
at org.apache.axis2.transport.http.HTTPSender.sendViaPost(HTTPSender.java:194)
at org.apache.axis2.transport.http.HTTPSender.send(HTTPSender.java:75)
at org.apache.axis2.transport.http.CommonsHTTPTransportSender.writeMessageWithCommons(CommonsHTTPTransportSender.java:396)
at org.apache.axis2.transport.http.CommonsHTTPTransportSender.invoke(CommonsHTTPTransportSender.java:223)
at org.apache.axis2.engine.AxisEngine.send(AxisEngine.java:443)
at org.apache.axis2.description.OutInAxisOperationClient.send(OutInAxisOperation.java:406)
at org.apache.axis2.description.OutInAxisOperationClient.executeImpl(OutInAxisOperation.java:229)
at org.apache.axis2.client.OperationClient.execute(OperationClient.java:165)
at org.apache.axis2.client.ServiceClient.sendReceive(ServiceClient.java:555)
at org.apache.axis2.client.ServiceClient.sendReceive(ServiceClient.java:531)
at com.cybozu.garoon3.common.CBServiceClient.sendReceive(CBServiceClient.java:178)
at com.cybozu.GGsync.main(GGsync.java:168)
設定の時は何か間違いところがありますか?
正しい方法を私に教えてもらいませんか。
よろしくおねがいします。
夏 龍さん
garoon.urlのhttp://、https://はあっていますか?
エラーの内容からGaroonのURL設定値に誤りがある可能性が高そうです。
竹内さん
お世話になっております。
エラーの解決方法を私に教えてもらいました、ありがとうございました。
Garoon.urlの設定は正しいに変更しました。
でも、新しいエラーが発生しました。
INFO 2019/05/10 18:19:38(GGsync:main:83) The sync beginning with normal mode.
INFO 2019/05/10 18:19:43(GGsync:main:393) [ADD] Title:出張
ERROR 2019/05/10 18:20:03(GGsync:main:449) connect timed out
java.net.SocketTimeoutException: connect timed out
at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at sun.security.ssl.SSLSocketImpl.connect(Unknown Source)
at sun.net.NetworkClient.doConnect(Unknown Source)
at sun.net.www.http.HttpClient.openServer(Unknown Source)
at sun.net.www.http.HttpClient.openServer(Unknown Source)
at sun.net.www.protocol.https.HttpsClient.<init>(Unknown Source)
at sun.net.www.protocol.https.HttpsClient.New(Unknown Source)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.getNewHttpClient(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.plainConnect(Unknown Source)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.getOutputStream0(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(Unknown Source)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(Unknown Source)
at com.google.api.client.http.javanet.NetHttpRequest.execute(NetHttpRequest.java:77)
at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:972)
at com.google.api.client.auth.oauth2.TokenRequest.executeUnparsed(TokenRequest.java:283)
at com.google.api.client.auth.oauth2.TokenRequest.execute(TokenRequest.java:307)
at com.google.api.client.googleapis.auth.oauth2.GoogleCredential.executeRefreshToken(GoogleCredential.java:384)
at com.google.api.client.auth.oauth2.Credential.refreshToken(Credential.java:489)
at com.google.api.client.auth.oauth2.Credential.intercept(Credential.java:217)
at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:859)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:419)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:352)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:469)
at com.cybozu.GoogleCalendar.addSchedule(GoogleCalendar.java:81)
at com.cybozu.GGsync.main(GGsync.java:405)
夏 龍さん
Googleへの接続がタイムアウトしていますね。
こちらはネットワークに問題がありそうです。
プロキシを通る場合は本文の「プロキシ経由の実行」を参考にしてください。
※Garoonがhttpsの場合でGoogle接続のみプロキシ経由となる場合は接続できないかもしれません
Googleをプロキシ経由にするとGaroonもプロキシ経由となるため