You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Swift 4中使用Sheets API v4创建Google表格并获取表格ID

在Swift 4中使用Google Sheets API创建新表格并获取Spreadsheet ID

我来帮你搞定这个问题——你当前的代码只是发起了一个GET请求,但Google Sheets API创建新表格需要用POST请求,还要带上必要的认证信息和请求体。下面是完整的实现步骤和代码示例:

关键前提

首先要确保你已经完成了基础配置:

  • 在Google Cloud Console中启用了Sheets API
  • 获取了OAuth 2.0客户端ID,并且已经通过认证流程拿到了有效的访问令牌(令牌需要包含https://www.googleapis.com/auth/spreadsheets权限范围)

完整实现代码

import Foundation

func createNewSheet(withAccessToken token: String, completion: @escaping (String?, Error?) -> Void) {
    // 校验API URL有效性
    guard let apiUrl = URL(string: "https://sheets.googleapis.com/v4/spreadsheets") else {
        let invalidURLError = NSError(domain: "SheetAPIError", code: -1, userInfo: [NSLocalizedDescriptionKey: "无效的API地址"])
        completion(nil, invalidURLError)
        return
    }
    
    // 构造请求体:定义新表格的基本属性(这里自定义表格标题)
    let spreadsheetProperties: [String: Any] = [
        "properties": [
            "title": "我的新表格"
        ]
    ]
    
    // 将请求体序列化为JSON数据
    guard let requestBodyData = try? JSONSerialization.data(withJSONObject: spreadsheetProperties) else {
        let serializationError = NSError(domain: "SheetAPIError", code: -2, userInfo: [NSLocalizedDescriptionKey: "请求体序列化失败"])
        completion(nil, serializationError)
        return
    }
    
    // 配置请求
    var request = URLRequest(url: apiUrl)
    request.httpMethod = "POST" // 创建表格必须用POST
    request.httpBody = requestBodyData
    // 添加认证头:Bearer + 访问令牌
    request.setValue("Bearer \(token)", forHTTPHeaderField: "Authorization")
    // 声明请求体格式为JSON
    request.setValue("application/json", forHTTPHeaderField: "Content-Type")
    
    // 发起网络请求
    let task = URLSession.shared.dataTask(with: request) { responseData, _, requestError in
        // 先处理网络错误
        if let error = requestError {
            completion(nil, error)
            return
        }
        
        // 校验返回数据是否存在
        guard let data = responseData else {
            let noDataError = NSError(domain: "SheetAPIError", code: -3, userInfo: [NSLocalizedDescriptionKey: "未收到API返回数据"])
            completion(nil, noDataError)
            return
        }
        
        // 解析响应JSON,提取spreadsheetId
        do {
            if let responseJSON = try JSONSerialization.jsonObject(with: data) as? [String: Any],
               let sheetId = responseJSON["spreadsheetId"] as? String {
                // 成功获取表格ID,回调返回
                completion(sheetId, nil)
            } else {
                let parseError = NSError(domain: "SheetAPIError", code: -4, userInfo: [NSLocalizedDescriptionKey: "无法从响应中提取表格ID"])
                completion(nil, parseError)
            }
        } catch let jsonError {
            completion(nil, jsonError)
        }
    }
    
    task.resume()
}

// 使用示例
// 替换成你实际获取到的有效访问令牌
let userAccessToken = "YOUR_VALID_ACCESS_TOKEN"
createNewSheet(withAccessToken: userAccessToken) { sheetId, error in
    if let id = sheetId {
        print("表格创建成功!ID:\(id)")
        // 这里就可以用这个ID进行后续的表格操作了(比如写入数据、读取内容等)
    } else if let err = error {
        print("创建失败:\(err.localizedDescription)")
    }
}

核心要点说明

  • 请求方法必须是POST:GET请求仅用于查询现有表格信息,创建操作必须用POST。
  • 认证头不可少:创建表格需要用户授权,所以必须在请求头中携带Bearer + 访问令牌,API密钥无法用于创建表格(仅能访问公开资源)。
  • 请求体定义表格属性:至少要指定表格标题,你也可以添加更多属性(比如默认工作表名称、格式等)。
  • 提取spreadsheetId:API响应的JSON中会直接返回spreadsheetId字段,这就是你后续复用表格需要的唯一标识。

内容的提问来源于stack exchange,提问作者Carlos27

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:35:03