Как я могу начать писать через Google Sheets API?

На моем пути изучения API Google Таблиц с Swift я хотел записать один диапазон в электронную таблицу.

Изучите Руководство по быстрому запуску iOS и Основные примеры написания Я пришел с этим кодом:

func constructAndSendAQuery() {
    let baseUrl = "https://sheets.googleapis.com/v4/spreadsheets"
    let spreadsheetId = "1FhbBdEvpcyHsdfgsdft65eDGHre2fLVki5ZolMmZaRs"
    let range = "Sales!A31:C31"
    let url = baseUrl + "/" + spreadsheetId + "/values/" + range
    let params = ["valueInputOption": "RAW"]
    let fullUrl = GTLUtilities.URLWithString(url, queryParameters: params)

    let body = GTLObject()
    body.JSON = ["majorDimension":"ROWS",
                 "values": ["One", "Two", "Three"]]

    service.fetchObjectByInsertingObject(body, 
                                         forURL: fullUrl,
                                         delegate: self, 
                                         didFinishSelector: #selector(ViewController.processTheResponse(_:finishedWithObject:error:)))
}

Не знаю, что я сделал не так, но я получил сообщение об ошибке: «Запрошенный URL не найден на этом сервере».


person Artem Kirillov    schedule 14.06.2016    source источник


Ответы (3)


Как упоминал @ sam-berlin, я должен был использовать fetchObjectByUpdatingObject вместо fetchObjectByInsertUpdating.

Но была еще одна маленькая ошибка / опечатка. При построении JSON я потерял пару квадратных скобок и получил ошибку о недопустимом значении.

Рабочий код выглядит так:

func constructAndSendARequest() {

    let baseUrl = "https://sheets.googleapis.com/v4/spreadsheets"
    let spreadsheetId = "1FhbBdEvpsfgzb3Akn1opmru0iresdfglbki5ZMmZaRs"
    let range = "Sales!A3:D3"
    let url = baseUrl + "/" + spreadsheetId + "/values/" + range
    let params = ["valueInputOption": "RAW"]
    let fullUrl = GTLUtilities.URLWithString(url, queryParameters: params)


    let body = GTLObject()
    body.JSON = ["range": range,
                 "majorDimension": "ROWS",
                 "values": [["One", "Two", "Three"]]]

    service.fetchObjectByUpdatingObject(body, forURL: fullUrl, delegate: self, didFinishSelector: #selector(ViewController.processTheResponse(_:finishedWithObject:error:)))   
}

Также можно использовать service.fetchObjectByUpdatingObject(body, forURL: fullUrl, completionHandler: nil) и не обрабатывать ответ.

person Artem Kirillov    schedule 14.06.2016

Согласно коду GTLService, fetchObjectByInsertUpdating выполняет POST, тогда как для этого запроса требуется PUT. Кажется, что fetchObjectByUpdatingObject должен сделать PUT, так что попробуйте это вместо этого.

person Sam Berlin    schedule 14.06.2016

Если кому-то нужно, я ответил здесь по аналогичному вопросу. Вы можете использовать объект GTLRSheets_ValueRange() и GTLRSheetsQuery_SpreadsheetsValuesUpdate.query(withObject: для создания или обновления любой ячейки через Google Sheets API.

let service = GTLRSheetsService()
service.authorizer = GIDSignIn.sharedInstance().currentUser.authentication.fetcherAuthorizer()
service.apiKey = Constants.GOOGLE_SPEADSHEET_API_KEY
let rowIndex:Int = job.rowIndex
let range = "Employee List!C\(rowIndex):C\(rowIndex)"
let valueRange = GTLRSheets_ValueRange()
valueRange.range = "Employee List!C\(rowIndex):C\(rowIndex)"
valueRange.values = [[job.jobTitle!]]
valueRange.majorDimension = "COLUMNS"

let query = GTLRSheetsQuery_SpreadsheetsValuesUpdate.query(withObject: valueRange, spreadsheetId:  Constants.SPREAD_SHEET_ID, range: range)
query.valueInputOption = "USER_ENTERED"

service.executeQuery(query) { (ticket, response, error) in
    print(response)

}
person Sergey Neskoromny    schedule 19.09.2018