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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 15:18:15