この投稿ではSwiftからGAS(GoogleAppsScript)の簡易APIを叩く方法について考えます。
私はGASとiOS開発を主にしていますが、「iOS側からGAS叩きたいな」とずっと思っていました。
GASをiOSから叩く方法はいくつかあります。ExtentionAPIを使ったり、ライブラリを使ったりできますが、どれもサクッとはできません。GASで作るAPIってサーバーレスだからいいんじゃないですか。シンプルに実装したいじゃないですか。
ということで今回は、外部ライブラリ等を利用せずに、標準フレームワークを使ってGASを叩いてみる方法を軽くご紹介します。
完成例
Google版Excelである、Googleスプレッドシートにあるデータの任意の列(row)、行(colom)にあるデータを、持ってくることができます。
やり方
まずはやってみましょう!!
まずは、指定した列と行に対応するデータを返す必要がありますから、スプレッドシートに適当にデータを入力しておきます。
自分の場合は、A1セルに、=CELL(“address”,A1) と入力し、これをオートフィルしました。
次に、GoogleSpreadsheetからスプレッドシートを開いて、下のコードをコピペします。
GAS
function myFunction(row,colom) {
var ss = SpreadsheetApp.getActiveSpreadsheet()
var sss = ss.getSheetByName('シート1')
var data = sss.getDataRange().getValues()
return {'data':data[colom+1][row+1]}
}
function doGet(e){
var usecase = e.parameter.usecase
if (usecase == "iosgetcurrent"){
var result = myFunction(Number(e.parameter.row),Number(e.parameter.colom));
return ContentService.createTextOutput(JSON.stringify(result)).setMimeType(ContentService.MimeType.JSON);
}
}
この後、下の画像のように、「公開」から「ウェブアプリケーションとして導入」を押します。この辺りは詳しくはこちらの記事を参照してください。
これでWeb側の準備は完了です。次に、Swift側の準備をします。
Swift
こちらの記事を参照に、新規プロジェクトを立ち上げたら、同じく、下のコードを、ViewController Classの中にメソッドとして用意します。コピペで大丈夫です。
func getHTTP(){
let apiUrl = "https://script.google.com/macros/s/AKfycbxZfq0m_19g4RgT53B_Bbtm-aCk_LhzMdCNKpFNCe2CvcK837sH/exec?"
let paramString = "usecase=iosgetcurrent&colom=1&row=1"
var request = URLRequest(url: URL(string: apiUrl + paramString)!)
request.httpMethod = "GET"
let task = URLSession.shared.dataTask(with: request, completionHandler: {
(data, response, error) in
if error != nil {
print(error as Any)
return
}
print("response: \(response!)")
let decodedOutput = String(data: data!, encoding: .utf8)!
print("decoded output: \(decodedOutput)")
struct NewJson: Codable {
var celstr: String
}
let data: Data = data!
let decoder: JSONDecoder = JSONDecoder()
do {
let newJson: NewJson = try decoder.decode(NewJson.self, from: data)
print(newJson)
print(newJson.celstr)
} catch {
print("json convert failed in JSONDecoder", error.localizedDescription)
}
})
task.resume()
}
これで完了です! お疲れ様でした!