Как написать в Google Sheets в Swift - PullRequest
0 голосов
/ 25 июня 2018

Я пытаюсь записать документ в Google Sheets, выполнив этот 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, и, кажется, ее не существует, когда я пытаюсь использовать ее в своем коде

Будучи совершенно растерянным, как это сделать, я попытался:

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 или чего-либо подобного.

Может кто-нибудь помочь мне, пожалуйста? Я очень потерянный

Ответы [ 2 ]

0 голосов
/ 26 декабря 2018

Вот ответ на ваш вопрос с использованием библиотеки GoogleAPIClientForREST, на которую вы ссылались в исходном вопросе (не то, что использование AlamoFire неверно, но API Google Sheets было бы более каноническим способом сделать это):

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
}
0 голосов
/ 29 июня 2018

Мне удалось понять это. Поэтому для того, чтобы писать на листы 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) }
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...