如何写入 Swift 中的 Google 工作表

How to write to Google Sheets in Swift

我正在尝试按照 this 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:)))
}

我尝试按照 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
});

但我对 SpreadsheetsApp.getActiveSpreadsheet() 的来源感到非常迷茫。我真的不知道 SpreadsheetsApp 或 Sheets object/library 是什么,当我尝试在我的代码中使用它时它似乎不存在

完全不知道如何做到这一点,我试过:

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
    })
}

但是,正如预期的那样,我收到了很多错误,因为查询没有 newValueRange 方法、values.update 方法或类似的方法。

有人可以帮帮我吗?我很迷茫

我设法弄明白了。因此,为了写入 google 工作表,我需要一个 JSON PUT 请求(或 POST 请求),我使用 Alamofire 发送了该请求。由于我之前已经在我的应用程序中配置了 Google Sign-In,因此只需弄清楚语法并应用来自我的 GIDSignIn.sharedInstance().currentUser.authentication.accessToken 的授权令牌并将其用作 header 在 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) }
    }

}

这是使用您在原始问题中引用的 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
}