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

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

ただいまの
回答率

88.93%

[php] Google Calendar APIで例外をスローできない

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,138

G_chan

score 17

お世話になっております。
定年退職を期に開発を始めました。

言い回しや間違った点がありましたら指摘していただけますと幸いです。

例題の件ですが、phpのプログラムからCalendarAPIに接続し、スケジュールの登録と変更を行いたいです。

現状できていることは、スケジュールの登録、イベントidの取得、取得したイベントidのイベントの変更です。

やりたいことは、登録する際にすでに登録するイベントidがあるかどうかを調べるためイベントidを引数にとしてイベントを取得します。すでにイベントがある(空でないイベントが取得できた)場合はイベントの開催時間を変更(update)する。
イベントがない(空のイベントを取得)した場合は登録(insert)する。

発生している問題は、後者のイベントが登録されていない場合、存在しないイベントを取得しようとするのでエラーが発生するのですが、その例外をスローできておらずFatal errorが発生しております。

↓イベントを取得するプログラム

<?php
date_default_timezone_set('Asia/Tokyo');
require_once __DIR__.'/google-api-php-client/vendor/autoload.php' ;
$json_path = __DIR__.'/google-api-php-client/key/*****.json';
$calendarId='******'; 

//接続用のクライアントの設定.
$scopes = "https://www.googleapis.com/auth/calendar.events";
$client = new Google_Client();
$client->setApplicationName("********");
$client->setAuthConfig($json_path);
$client->setScopes($scopes);
if ($client->isAccessTokenExpired()) {
    $client->refreshTokenWithAssertion();
}
$service = new Google_Service_Calendar($client);

//イベント取得
$eventId = 20180129;
$result = $service->events->get($calendarId, "eid");

?>

発生しているエラー↓

Fatal error: Uncaught exception 'Google_Service_Exception' with message '{ "error": { "errors": [ { "domain": "global", "reason": "notFound", "message": "Not Found" } ], "code": 404, "message": "Not Found" } } ' in /ドメイン名/googlecalendar/google-api-php-client/src/Google/Http/REST.php:118 Stack trace: #0 /ドメイン名/googlecalendar/google-api-php-client/src/Google/Http/REST.php(94): Google_Http_REST::decodeHttpResponse(Object(GuzzleHttp\Psr7\Response), Object(GuzzleHttp\Psr7\Request), 'Google_Service_...') 
#1 [internal function]: Google_Http_REST::doExecute(Object(GuzzleHttp\Client), Object(GuzzleHttp\Psr7\Request), 'Google_Service_...') 
#2 /ドメイン名/googlecalendar/google-api-php-client/src/Google/Task/Runner.php(176): call_user_func_array(Array, Array) 
#3 /ドメイン名/googlecalendar/google-api-php-client/src/Google/Http/REST.php(58): Google_Task_Runner->run()
#4 /ドメイン名 in /ドメイン名/googlecalendar/google-api-php-client/src/Google/Http/REST.php on line 118

また、このプログラムはグーグルカレンダーにイベントを登録すると同時にDBにもイベント情報を登録していまうす。何らかのエラーでテーブルへの書き込みが中断されたらグーグルカレンダーもトランザクションするようなことは可能でしょうか。

拙い文章で申し訳ありませんがよろしくお願いいたします。

  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • m.ts10806

    2019/01/29 13:00

    もう少し全体の流れがわかるようなコード提示は可能でしょうか?
    パスワードなどがある箇所は適当に***などマスクかけてもらって構いません。

    キャンセル

  • G_chan

    2019/01/29 13:11

    コメントありがとうございます。
    全体の流れのコードを追記しました。

    キャンセル

  • papinianus

    2019/01/29 14:21

    そのエラーだとパラメータが間違ってる可能性がありそうなんですが、もしそうだとここで回答を得るのは難しそうですね…

    キャンセル

回答 2

checkベストアンサー

+2

どこかでエラーとなっているのは間違いないので、try-catchでエラーをキャッチするように作ってみては?

※未検証:

try{

  //接続用のクライアントの設定.
  $scopes = "https://www.googleapis.com/auth/calendar.events";
  $client = new Google_Client();
  $client->setApplicationName("********");
  $client->setAuthConfig($json_path);
  $client->setScopes($scopes);
  if ($client->isAccessTokenExpired()) {
    $client->refreshTokenWithAssertion();
  }
  $service = new Google_Service_Calendar($client);

  //イベント取得
  $eventId = 20180129;
  $result = $service->events->get($calendarId, "eid");


}catch (Google_Service_Exception $e) {
    var_dump($e);
}

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/01/31 20:53

    try{
    }catch (Google_Service_Exception $e) {
    }
    その通りでございます。

    Google_Service_ExceptionでキャッチしないといけないところをExceptionとしておりました。
    キャッチもできないわけです。
    こんな初歩で詰んでしまうとは情けないです。
    私はもっとphpの基礎について勉強しないといけないようです。
    ご回答ありがとうございました。

    キャンセル

  • 2019/02/01 06:46

    始めて間もないのですよね?でしたら悲観することはないと思います。
    ひとまずエラーメッセージをよく読むようにして、あとはデバッグを覚えると良いです。

    キャンセル

+2

何らかのエラーでテーブルへの書き込みが中断されたらグーグルカレンダーもトランザクションするようなことは可能でしょうか。

別サービス(別アプリと言ったほうがいいのですかね、一般に言うサービスではないです)、に対するトランザクションは、あまり用意されていませんので、自分でtry/catch/finallyで対応するしかないです。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/01/31 21:37

    回答ありがとうございます。
    今回はその形で進めていくことにしました。
    もっと勉強します。

    キャンセル

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

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

関連した質問

同じタグがついた質問を見る