🕌

【Swift】iOSアプリからGoogleスプレッドシートの値を取得する方法

2023/05/01に公開

概要

Googleのスプレッドシートにある値をiOSアプリから取得する方法を紹介したいと思います。

環境

この記事は以下のバージョン環境のもと作成されたものです。
【Xcode】14.3
【iOS】16.4
【macOS】Ventuta

準備

スプレッドシートから値を取得するには

  • APIキー
  • スプレッドシートID
  • シート名

が必要となります。上記を取得するまでの準備に関しては以下の手順で行う事ができます。

APIキー

  1. Google API Consoleにアクセスし、ログインします。
  2. プロジェクトを新規作成するか、既存のプロジェクトを選択します。
  3. 「ダッシュボード」に移動し、「+ APIとサービスを有効にする」をクリックします。
  4. 検索ボックスに「Google Sheets API」と入力し、選択して「有効にする」をクリックします。
  5. APIが有効になったら、「認証情報」ページに移動します。
  6. 「認証情報を作成」をクリックし、「APIキー」を選択します。
    これでAPIキーが生成されます。

スプレッドシートID

スプレッドシートIDに関してはGoogle Sheets API の概要に記載されている通り、https://docs.google.com/spreadsheets/d/spreadsheetId/edit#gid=0spreadsheetId部分がスプレッドシートIDになるので既存のスプレッドシートもしくは新規作成したスプレッドシートから取得します。
その際にアクセスの設定を「リンクを知っている全員」にしておく必要があります。

シート名

シート名はスプレッドシートの下方にある名前です。

今回はTestSheetという名のSheetを使用します。

実践

実装はこんな感じです。

struct SpreadSheetResponse: Codable {
    let range: String
    let majorDimension: String
    let values: [[String]]
}
class SpreadSheetManager: ObservableObject {
    private let apiKey = "ここにAPIキーを記載"
    private let spreadsheetId = "ここにスプレッドシートIDを記載"
    private let sheetName = "ここにシート名を記載 今回はTestSheet"
    private let cellRange = "A1:B10"
    @Published private(set) var spreadSheetResponse = SpreadSheetResponse(range: "", majorDimension: "", values: [[""]])

    @MainActor
    func fetchGoogleSheetData() async throws {
        let baseURL = "https://sheets.googleapis.com/v4/spreadsheets"
        let url = "\(baseURL)/\(spreadsheetId)/values/\(sheetName)!\(cellRange)?key=\(apiKey)"
        guard let requestURL = URL(string: url) else {
            throw NSError(domain: "Invalid URL", code: 0, userInfo: nil)
        }
        let (data, _) = try await URLSession.shared.data(from: requestURL)
        let decoder = JSONDecoder()
        let spreadSheetResponse = try decoder.decode(SpreadSheetResponse.self, from: data)
        self.spreadSheetResponse = spreadSheetResponse
    }
}
struct ContentView: View {
    @StateObject private var spreadSheetManager = SpreadSheetManager()
    var body: some View {
        VStack {
            Text("スプレッドシートから取得")
            ForEach(spreadSheetManager.spreadSheetResponse.values, id: \.self) { index in
                Text(index.description)
            }
        }
        .task {
            do {
                try await spreadSheetManager.fetchGoogleSheetData()
                print("success")
            } catch {
                print("error: \(error)")
            }
        }
    }
}

各キャプチャは以下の通りです。

スプレッドシートのキャプチャ Viewのキャプチャ

まとめ

GASを使用して実装する方法もあるみたいですが今回はGoogle API ConsoleからGoogle Sheets APIを有効にしてGoogleスプレッドシートにある値をiOSアプリから取得してみました。簡単にかつ、スプレッドシートがDBの役割を持たせられるのでいいなと思いました。Arduinoやラズパイなどのマイコン→スプレッドシート→iOSみたいなケースで使ってみたいと思いました。

Discussion