如何在Swift中写入Google表格

Jef*_*hen 5 xcode ios swift google-sheets-api

我正在尝试通过遵循此google api写入Google表格文档,但没有取得太大的成功。我什至不确定我是否遵循正确的api,因为它显示为“ Appscript”,看起来像Swift。

我已经能够使用以下方法从工作表中读取数据:

private let scopes = [kGTLRAuthScopeSheetsSpreadsheets]
private let service = GTLRSheetsService()

override func viewDidLoad() {
    super.viewDidLoad()
    self.service.authorizer = GIDSignIn.sharedInstance().currentUser.authentication.fetcherAuthorizer()
    getData()
}

func getData() {
        let spreadsheetId = "1OAbhzY7RlfCEre-I5e-Kcgz16eHz2cGpO9HZKOiizCs" // Portfolio
    let query = GTLRSheetsQuery_SpreadsheetsValuesGet.query(withSpreadsheetId: spreadsheetId, range:range)
    service.executeQuery(query, delegate: self, didFinish: #selector(displayResultWithTicket(ticket:finishedWithObject:error:)))
}
Run Code Online (Sandbox Code Playgroud)

我尝试按照api所说的部分进行操作:

// This code uses the Sheets Advanced Service, but for most use cases
// the built-in method SpreadsheetApp.getActiveSpreadsheet()
//     .getRange(range).setValues(values) is more appropriate.
var values = [
  [
    // Cell values ...
  ]
  // Additional rows ...
];
var valueRange = Sheets.newValueRange();
valueRange.values = values;
var result = Sheets.Spreadsheets.Values.update(valueRange, spreadsheetId, range, {
  valueInputOption: valueInputOption
});
Run Code Online (Sandbox Code Playgroud)

但是我对SpreadsheetsApp.getActiveSpreadsheet()的来源很迷失。我真的不知道SpreadsheetsApp或Sheets对象/库是什么,当我尝试在代码中使用它时似乎不存在

我对如何做到这一点完全迷失了,我尝试:

func writeData() {
    let spreadsheetId = "1OAbhzY7RlfCEre-I5e-Kcgz16eHz2cGpO9HZKOiizCs"
    let range = "A1:E"
    let query = GTLRSheetsQuery_SpreadsheetsValuesGet.query(withSpreadsheetId: spreadsheetId, range:range)
    var values = [[]]
    var valueRange = query.newValueRange()
    valueRange.values = values
    var result = query.values.update(valueRange, spreadsheetId, range, {
        valueInputOption: valueInputOption
    })
}
Run Code Online (Sandbox Code Playgroud)

但是,正如预期的那样,由于查询没有newValueRange方法,values.update方法或类似的东西,我遇到了很多错误。

谁能帮我吗?我很迷路

Eva*_*n R 7

这是使用GoogleAPIClientForREST您在原始问题中引用的库对您的问题的答案(不是使用AlamoFire不正确,但 Google Sheets API 将是更规范的方法):

func updateSheets() {
    let range = "Sheet1!A3:C3" // Sheet titled "Sheet1", range A3 to C3
    let updateValues = [["Foo", "Bar", "Baz"]]
    let valueRange = GTLRSheets_ValueRange() // GTLRSheets_ValueRange holds the updated values and other params
    valueRange.majorDimension = "ROWS" // Indicates horizontal row insert
    valueRange.range = range
    valueRange.values = updateValues
    let query = GTLRSheetsQuery_SpreadsheetsValuesAppend.query(withObject: valueRange, spreadsheetId: kSpreadsheetID, range: range) // Use an append query to append at the first blank row
    query.valueInputOption = "USER_ENTERED"
    service.executeQuery(query) { ticket, object, error in
        print("object")
    } // `GTLRServiceCompletionHandler` closure containing the service ticket, `GTLRSheets_AppendValuesResponse`, and any error
}
Run Code Online (Sandbox Code Playgroud)


Jef*_*hen 4

我设法弄清楚了。因此,为了写入 Google 表格,我需要一个 JSON PUT 请求(或 POST 请求),我使用 Alamofire 发送该请求。由于我之前已经在我的应用程序中配置了 Google Sign-In,因此只需弄清楚语法并应用我的授权令牌GIDSignIn.sharedInstance().currentUser.authentication.accessToken并将其用作 Alamofire JSON 请求中的标头即可。这是代码:

import GoogleSignIn
import GoogleAPIClientForREST
import Foundation

import Alamofire

class TestController: UIViewController {

    private let scopes = [kGTLRAuthScopeSheetsSpreadsheets]
    private let service = GTLRSheetsService()

    override func viewDidLoad() {
        super.viewDidLoad()

        let sheetID = "1OAbhzY7RlfCEre-I5e-Kcgz16eHz2cGpO9HZKOiizCs"
        let range = "A3:B4"
        let requestParams = [
            "values": [ 
                ["hi1", "hi2"],
                ["hi3", "hi4"]
                ]
            ]
        let accessToken = GIDSignIn.sharedInstance().currentUser.authentication.accessToken!
        let header = ["Authorization":"Bearer \(accessToken)"]
        let requestURL = "https://sheets.googleapis.com/v4/spreadsheets/\(sheetID)/values/\(range)?valueInputOption=USER_ENTERED"
        let req = Alamofire.request(requestURL, method: .put, parameters: requestParams, encoding: JSONEncoding.default, headers: header)
        req.responseJSON { response in debugPrint(response) }
    }

}
Run Code Online (Sandbox Code Playgroud)