🕌
【Swift】iOSアプリからGoogleスプレッドシートの値を取得する方法
概要
Googleのスプレッドシートにある値をiOSアプリから取得する方法を紹介したいと思います。
環境
この記事は以下のバージョン環境のもと作成されたものです。
【Xcode】14.3
【iOS】16.4
【macOS】Ventuta
準備
スプレッドシートから値を取得するには
- APIキー
- スプレッドシートID
- シート名
が必要となります。上記を取得するまでの準備に関しては以下の手順で行う事ができます。
APIキー
- Google API Consoleにアクセスし、ログインします。
- プロジェクトを新規作成するか、既存のプロジェクトを選択します。
- 「ダッシュボード」に移動し、「+ APIとサービスを有効にする」をクリックします。
- 検索ボックスに「Google Sheets API」と入力し、選択して「有効にする」をクリックします。
- APIが有効になったら、「認証情報」ページに移動します。
- 「認証情報を作成」をクリックし、「APIキー」を選択します。
これでAPIキーが生成されます。
スプレッドシートID
スプレッドシートIDに関してはGoogle Sheets API の概要に記載されている通り、https://docs.google.com/spreadsheets/d/spreadsheetId/edit#gid=0
のspreadsheetId
部分がスプレッドシート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