如何写入 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
}
我正在尝试按照 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
}