iOSアプリからスプレッドシートのデータを読み込みたい時が人生にはあります。その方法です。
大まかな流れ
iOSからスプレッドシートのデータを読むためには、スプレッドシート側にGAS(Google Apps Script)を実装する必要があります。GASでスプレッドシートをReadするGETを実装し、iOSからそこ目掛けて通信する実装をすれば完成です。
GASの実装
スプレッドシートの「シート1」シートに下記のようなデータがあるものとします。
スプレッドシートメニューのツール>スクリプトエディタ
を選択します。
するとApps Scriptエディタが開きます。
ここに処理を実装していきます。
Readする
スプレッドシートのデータを読み込む方法は以下の通りです。
function myFunction(){
var targetFileID = DriveApp.getFileById("xxxxx")
var targetFile = SpreadsheetApp.open(targetFileID)
var targetSheet = targetFile.getSheetByName("シート1")
var values = targetSheet.getRange(3, 1, 1, 4).getValues()
console.log(values)
}
//出力結果
22:51:30 情報 [ [ '花子', 22, 15, 5 ] ]
-
DriveApp.getFileById("xxxxx")
でGoogle Drive内にある対象ファイルのIDを取得します。※1 -
SpreadsheetApp.open(targetFileID)
で対象ファイルを取得します。 -
targetFile.getSheetByName("シート1")
で対象ファイル内の対象シートを取得します。 -
targetSheet.getRange(3, 1, 1, 4).getValues()
で対象シート内の3行目1列目のセルを起点に、1行分4列目まで取得します。 - デバッグするにはメニューバーにある
▷実行
を押します。- スプレッドシートの内容にアクセスする場合、初回はアクセス権限に関する表示が出るので対処します。
※1:ファイルIDはURLの https://docs.google.com/spreadsheets/d/xxxxx/edit#gid=0 の「xxxxx」にあたる部分です
GETを実装する
GASでWebAPIを実装できます。GASの中でGETならdoGet(e)
を定義し実装します。これをウェブアプリとして公開するとWebAPIが発行され外部からアクセスできるようになります。
doGet(e)
スプレッドシートの内容をWebAPI経由で取得する方法は以下の通りです。
function doGet(e){
var targetFileID = DriveApp.getFileById("xxxxx")
var targetFile = SpreadsheetApp.open(targetFileID)
var targetSheet = targetFile.getSheetByName("シート1")
var values = targetSheet.getRange(3, 1, 1, 4).getValues()
return ContentService.createTextOutput(JSON.stringify(values)).setMimeType(ContentService.MimeType.JSON)
}
-
myFunction()
をdoGet(e)
に書き換えます。 - データの取得までは
Readする
と同じです。 - returnに
ContentService.createTextOutput(JSON.stringify(values)).setMimeType(ContentService.MimeType.JSON)
を書きます。スプレッドシートの情報をJSON形式で返します。 -
デプロイ
を行い、WebAPIを発行します。- こちらの手順を参考にして下さい。
すると、このような形でWebAPIが取得できます。
試しにブラウザにそのURLを入力するとdoGet(e)
内で取得された情報が返ってくるのが確認できます。
iOSの実装
ここではiOSからGASのWebAPIへのアクセスを容易にするためにAlamofireとSwiftyJSONを用います。適宜インストールして下さい。
import UIKit
import Alamofire
import SwiftyJSON
class ViewController: UIViewController {
@IBOutlet weak var name: UILabel!
@IBOutlet weak var count: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
let url = "https://script.google.com/macros/s/xxx/exec" //上記で取得したWebAPI
AF.request(url, method: .get).responseJSON{ (response) in
switch response.result {
case .success(let elm):
let json = JSON(elm as Any)// [["花子", 22, 15, 5]]
self.name.text = json[0][0].stringValue
self.count.text = json[0][2].description
case .failure(_):
print("failure")
}
}
}
}
-
AF.request(_, method: .get)
で上で取得したWebAPIへGETで通信を行います -
response.result
にレスポンスが入るので、Switch文で分岐処理します - レスポンスをJSONオブジェクトに変換します
- JSONオブジェクトインスタンスの各要素にアクセスし、型に応じて変換処理をかけます
これをシュミレータで実行するとこうなります。
まとめ
iOSアプリからスプレッドシートのデータを読み込む方法をまとめました。
この様な流れでiOSからスプレッドシートのデータを読み込むことができます。
パラメータを付けて何行目のデータを取得する等、動的にすることも可能です。
スプレッドシートにデータを書き込む方法もまとめましたので、よろしければご覧ください。
おまけ
doGet()
を実装する際、デバッグする度iOS側からアクセスするのは面倒です。
下記のリンクに簡易デバッグの方法を記載しましたのでご参照ください。
GoogleAppsScriptでdoGet()をdebugする