Python调用Google Sheet API v4如何将数据插入表格最后一列
问题原因
当前调用Google Sheet API的append接口时,仅传入工作表名作为range参数,接口默认从A列(第一列)开始按行写入数据,没有指定列偏移和列插入规则,因此数据会默认落到第一列。
修改方案
要实现数据写入最后一列,需要完成两个核心调整:
- 先查询目标工作表当前已使用的最大列位置,计算新数据的写入起始列
- 调整API请求参数,指定按列维度写入、插入新列而非覆盖/追加行
具体代码修改
1. 改造GoogleSheets类
新增列位置计算方法、追加到最后一列的方法,替换原有按行追加的逻辑:
import string import flask from flask import Flask, jsonify, request, render_template from flask_cors import CORS import pandas as pd from main import GoogleAPIClient app = flask.Flask(__name__) CORS(app) app.config["DEBUG"] = True class GoogleSheets(GoogleAPIClient): def __init__(self) -> None: super().__init__( 'sheets', 'v4', ['https://www.googleapis.com/auth/spreadsheets'], ) def _col_num_to_letter(self, col_num: int) -> str: """数字列序号转A1格式列字母(如0->A、25->Z、26->AA)""" letter = '' while col_num >= 0: letter = string.ascii_uppercase[col_num % 26] + letter col_num = col_num // 26 - 1 return letter def _get_last_col_position(self, spreadsheetId: str, sheet_name: str) -> str: """获取指定工作表最后一列的下一列位置,作为新数据写入起点""" # 读取工作表元数据获取已使用列数,不受空单元格影响 sheet_meta = self.googleAPIService.spreadsheets().get( spreadsheetId=spreadsheetId, ranges=[sheet_name], includeGridData=False ).execute() target_sheet_prop = None for sheet in sheet_meta['sheets']: if sheet['properties']['title'] == sheet_name: target_sheet_prop = sheet['properties'] break # 空表默认从A列开始写 used_col_count = target_sheet_prop['gridProperties']['columnCount'] if target_sheet_prop else 0 return self._col_num_to_letter(used_col_count) def append_to_last_col(self, spreadsheetId: str, sheet_name: str, df: pd.DataFrame): """将DataFrame数据写入工作表最后一列""" start_col = self._get_last_col_position(spreadsheetId, sheet_name) # 写入范围指定为目标列第一行 target_range = f"{sheet_name}!{start_col}1" self.googleAPIService.spreadsheets().values().append( spreadsheetId=spreadsheetId, range=target_range, valueInputOption='USER_ENTERED', insertDataOption='INSERT_COLUMNS', # 写入时插入新列,不覆盖原有数据 body={ 'majorDimension': 'COLUMNS', # 传入数据按列解析,每个子数组对应一整列 'values': [df[col].tolist() for col in df.columns] }, ).execute() return 0
2. 调整路由调用逻辑
将原路由中调用appendWorksheet的部分替换为新的append_to_last_col方法:
@app.route('/', methods=['GET']) def home(): return "<h1>Hello Flask!</h1>" @app.route('/test2', methods=['POST']) def test2(): data = request.get_json() new_data = { 'uri': data['uri'] } myWorksheet = GoogleSheets() print(myWorksheet.append_to_last_col( spreadsheetId='1R4X_sDKko8QvVLP341DyFC0o0BM8hWiGoKi5JkNu4uA', sheet_name='工作表1', df=pd.DataFrame( { '體重': [new_data['uri']] } ) )) return "<h1>Append successful!</h1>" app.run()
关键参数说明
insertDataOption='INSERT_COLUMNS':告知API写入时插入新列,不会覆盖最后一列的原有数据majorDimension='COLUMNS':将传入的二维数组按列维度解析,适配追加新列的需求- 写入范围指定为
{sheet_name}!{start_col}1:明确写入起始位置,避免API默认从A列开始写入
如果你的工作表存在整列空白的情况,可以根据业务需要调整
_get_last_col_position方法的逻辑,比如读取第一行非空单元格位置作为最后一列,适配不同的表格结构。
内容的提问来源于stack exchange,提问作者Jayco
相关产品推荐
相关产品推荐

