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

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

新規登録して質問してみよう
ただいま回答率
87.20%
Google カレンダー

Google カレンダーは、Google社が提供する無料のスケジュール管理ツールです。パソコンやスマートフォン、タブレットなどからアクセスし、スケジュールの追加・変更が可能。Googleアカウントがあれば誰でも使用できます。

Google API

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

解決済

SwiftでGoogleカレンダーAPIを叩いてイベントを追加したい

tmyk1979
tmyk1979

総合スコア132

Google カレンダー

Google カレンダーは、Google社が提供する無料のスケジュール管理ツールです。パソコンやスマートフォン、タブレットなどからアクセスし、スケジュールの追加・変更が可能。Googleアカウントがあれば誰でも使用できます。

Google API

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

1回答

0評価

0クリップ

315閲覧

投稿2022/03/26 21:53

編集2022/04/07 03:39

前提

SwiftでGoogleカレンダーAPIを叩いてイベントを追加したいのですが、GoogleSignInを使ってログインする所まではできたのですが、その先のイベントを追加する所でどのようにリクエストを送れば良いのか分からず困っています。

どうすればイベントを追加できるかご教示いただきたいと思います。

発生している問題・エラーメッセージ

下記のコードの通りだと以下のエラーログのようにmessageが「Bad Request」になるのですが、httpBodyを書かずにリクエストを送るとmessageが「missing end time」となります。ただ、Getメソッドでリクエストを送るとGetなりのレスポンスが返ってくるのでエンドポイントが間違っているわけではなさそうです。

Optional(["error": { code = 400; errors = ( { domain = global; message = "Bad Request"; reason = badRequest; } ); message = "Bad Request"; }])

該当のソースコード

Swift

import UIKit import GoogleSignIn class ViewController: UIViewController { let signInConfig = GIDConfiguration.init(clientID: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx") //サインインボタン @IBAction func signIn(_ sender: AnyObject) { GIDSignIn.sharedInstance.signIn(with: signInConfig, presenting: self) { user, error in guard error == nil else { return } // If sign in succeeded, display the app's main content View. print("ログイン") let fullName = user?.profile?.name let email = user?.profile?.email let driveScopes = [ "https://www.googleapis.com/auth/calendar.readonly", "https://www.googleapis.com/auth/calendar", "https://www.googleapis.com/auth/calendar.events.readonly", "https://www.googleapis.com/auth/calendar.events" ] let grantedScopes = user?.grantedScopes if grantedScopes == nil || !grantedScopes!.contains(driveScopes[0]) || !grantedScopes!.contains(driveScopes[1]) || !grantedScopes!.contains(driveScopes[2]) || !grantedScopes!.contains(driveScopes[3]) { // Request additional Drive scope. let additionalScopes = [ "https://www.googleapis.com/auth/calendar.readonly", "https://www.googleapis.com/auth/calendar", "https://www.googleapis.com/auth/calendar.events.readonly", "https://www.googleapis.com/auth/calendar.events" ] GIDSignIn.sharedInstance.addScopes(additionalScopes, presenting: self) { user, error in guard error == nil else { return } guard let user = user else { return } // Check if the user granted access to the scopes you requested. getEvents(token: user.authentication.accessToken) } } else { getEvents(token: user!.authentication.accessToken) } } } //サインアウトボタン @IBAction func signOut(_ sender: AnyObject) { GIDSignIn.sharedInstance.signOut() print("ログアウト") } } private func getEvents(token: String) { var urlComponents = URLComponents(string: "https://www.googleapis.com/calendar/v3/calendars/xxxxxxxxx(カレンダーID)/events") urlComponents?.queryItems = [ URLQueryItem(name: "calendarId", value: "primary") // 例) emailとpasswordを付与 ] let config = URLSessionConfiguration.default let session = URLSession(configuration: config) var request = URLRequest(url: (urlComponents?.url)!) request.httpMethod = "POST" request.addValue("Bearer \(token)", forHTTPHeaderField: "Authorization") //==================================================== //そもそもここ以外に問題があるのかも知れませんが、現時点ではここの正しい //書き方が分からないためにうまく行っていないと思っています。 request.httpBody = "end=datetime:2022-03-27T00:00:00+09:00&timeZone:Asia/Tokyo".data(using: .utf8) //================================================ let task = session.dataTask(with: request) { (data, response, error) in if let data = data { let json = try? (JSONSerialization.jsonObject(with: data, options: .allowFragments) as! [String:Any]) print(json) } } task.resume() }

試したこと

GoogleDevelopersのサイトを見ながらコードを書いたのですが、Swiftの例文が無いので他の言語の例文を見ても何をやっているのか想像するしかありませんでした。

「Swift Google CalendarAPI イベント 追加」など色々な言葉を組み合わせて検索し、片っ端から例文を試したのですが、エラーや警告に阻まれてどれもうまく行きませんでした。

ディベロッパーサイトの「Try it now」も試したのですが、そもそもどんな内容でリクエストを送れば事足りるのかも分からないため、色々試しましたが様々なエラーが返ってくるだけでした。

どんな内容をどのようにリクエストとして送れば正しくレスポンスを得られるのか、教えていただけると助かります。よろしくお願いします。

補足情報(FW/ツールのバージョンなど)

Xcode11.6
iPhoneSE
iOS 13.6

良い質問の評価を上げる

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

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

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

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

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

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

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

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

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

tmyk1979

2022/03/28 07:49

アドバイスありがとうございます。 提示していただいたサイトは1回記事に沿ってコードを書いてみたのですが、ログイン画面を表示させる事ができずに断念していました。 とにかくもう一度やってみます。 取り急ぎお礼まで。
tmyk1979

2022/03/28 20:34

提示していただいたサイトのコードに沿ってもう一度やってみたのですが、ログイン画面は表示する事ができました。ただ、質問する時に作ったプロジェクトをコピーしたにも関わらず「承認エラー」となってしまい、リクエストの詳細には「このセクションのコンテンツはアプリデベロッパーが提供したものです。このコンテンツは、Googleで審査、検証されていません。」と表示されてしまいます。 質問する際に作ったプロジェクトでは自分のアカウントをOAuth ユーザーに登録したら、この認証エラーを解除できたのですが、今はすでに自分のアカウトはOAuthユーザーに登録されているので、認証エラーを解除する方法が分からない状況です。 もう少し自分で何とかできないか頑張ってみますので、もうしばらくお待ちください。m(__)m
tmyk1979

2022/03/29 19:26

質問を書いた時点ではredirectURLを認証済みドメインと同じ「example.com」にしていたのですが、(TwitterのcallbackURLのように同じにした方が良いと思っていた)サイトの例文の通りにした所、認証エラーも解消できました。もう少しでイベント追加もできるかもしれません。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

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

Google カレンダー

Google カレンダーは、Google社が提供する無料のスケジュール管理ツールです。パソコンやスマートフォン、タブレットなどからアクセスし、スケジュールの追加・変更が可能。Googleアカウントがあれば誰でも使用できます。

Google API

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています