LoginSignup
3
3

More than 1 year has passed since last update.

iOSアプリからスプレッドシードのデータを読み込む

Last updated at Posted at 2021-10-13

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 ] ]
  1. DriveApp.getFileById("xxxxx")でGoogle Drive内にある対象ファイルのIDを取得します。※1
  2. SpreadsheetApp.open(targetFileID)で対象ファイルを取得します。
  3. targetFile.getSheetByName("シート1")で対象ファイル内の対象シートを取得します。
  4. targetSheet.getRange(3, 1, 1, 4).getValues()で対象シート内の3行目1列目のセルを起点に、1行分4列目まで取得します。
  5. デバッグするにはメニューバーにある▷実行を押します。

※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)
}
  1. myFunction()doGet(e)に書き換えます。
  2. データの取得まではReadすると同じです。
  3. returnに ContentService.createTextOutput(JSON.stringify(values)).setMimeType(ContentService.MimeType.JSON) を書きます。スプレッドシートの情報をJSON形式で返します。
  4. デプロイを行い、WebAPIを発行します。

すると、このような形でWebAPIが取得できます。

試しにブラウザにそのURLを入力するとdoGet(e)内で取得された情報が返ってくるのが確認できます。

iOSの実装

ここではiOSからGASのWebAPIへのアクセスを容易にするためにAlamofireSwiftyJSONを用います。適宜インストールして下さい。

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")
            }
        }
    }
}
  1. AF.request(_, method: .get)で上で取得したWebAPIへGETで通信を行います
  2. response.resultにレスポンスが入るので、Switch文で分岐処理します
  3. レスポンスをJSONオブジェクトに変換します
  4. JSONオブジェクトインスタンスの各要素にアクセスし、型に応じて変換処理をかけます

これをシュミレータで実行するとこうなります。

まとめ

iOSアプリからスプレッドシートのデータを読み込む方法をまとめました。

この様な流れでiOSからスプレッドシートのデータを読み込むことができます。
パラメータを付けて何行目のデータを取得する等、動的にすることも可能です。

スプレッドシートにデータを書き込む方法もまとめましたので、よろしければご覧ください。

おまけ

doGet()を実装する際、デバッグする度iOS側からアクセスするのは面倒です。
下記のリンクに簡易デバッグの方法を記載しましたのでご参照ください。
GoogleAppsScriptでdoGet()をdebugする

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3