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

如何解决Python从Google Sheets取数后打印结果带括号的问题

问题:从Google Sheets取数后姓名为嵌套列表,导致短信内容带括号

我正在开发一款基于Twilio API的批量短信发送工具,用Google Sheets存储手机号与姓名列表。本地直接定义列表时,短信内容和打印结果均正常;但通过gspread从Google Sheets获取列表后,姓名元素变成嵌套列表(如['Zak']),导致短信和打印结果带括号,添加str前缀无效,求解决办法。


可正常运行的本地列表脚本

from twilio.rest import Client
import gspread

# 你的Twilio账户SID和Auth Token,从twilio.com/console获取
account_sid = '#################'
auth_token = '#################'
client = Client(account_sid, auth_token)


gc = gspread.service_account(filename='creds.json')

# 通过ID打开表格
sh = gc.open_by_key('1KRYITQ_O_-7exPZp8zj1VvAUPPutqtO4SrTgloCx8x4')

# 获取工作表
wk = sh.worksheet("Numbers to Send")

# 注释掉的表格取数代码
# numbers = wk.batch_get(('E3:E',))[0]
# names = wk.batch_get(('D3:D',))[0]

# 本地定义的一维列表
names = ['John', 'Jane', 'Jim']
numbers = ['+PhoneNumber', '+PhoneNumber', '+PhoneNumber']

# 遍历发送短信
for i in range(len(names)):
    message = client.messages.create(
        to=numbers[i],
        from_='+18442251378',
        body=f"Hello {names[i]}, this is a test message from Twilio.")
    print(f"Message sent to {names[i]} at {numbers[i]}")

存在问题的Google Sheets取数脚本

from twilio.rest import Client
import gspread

# 你的Twilio账户SID和Auth Token,从twilio.com/console获取
account_sid = '#####################'
auth_token = '######################'
client = Client(account_sid, auth_token)


gc = gspread.service_account(filename='creds.json')

# 通过ID打开表格
sh = gc.open_by_key('1KRYITQ_O_-7exPZp8zj1VvAUPPutqtO4SrTgloCx8x4')

# 获取工作表
wk = sh.worksheet("Numbers to Send")

# 从表格获取列数据(返回二维列表)
numbers = wk.batch_get(('E3:E',))[0]
names = wk.batch_get(('D3:D',))[0]

# 注释掉的本地列表代码
# names = ['John', 'Jane', 'Jim']
# numbers = ['+16099725052', '+16099725052', '+16099725052']

# 遍历发送短信(因嵌套列表导致内容带括号)
for i in range(len(names)):
    message = client.messages.create(
        to=numbers[i],
        from_='+18442251378',
        body=f"Hello {names[i]}, this is a test message from Twilio.")
    print(f"Message sent to {names[i]} at {numbers[i]}")

解决方法

问题根源是gspread的batch_get方法返回二维列表,即使取单列,每个单元格值也会被包裹在子列表中(比如names实际结构是[['John'], ['Jane'], ['Jim']])。以下三种方法可解决:

方法1:提前提取一维列表

遍历原始二维列表,取出每个子列表的第一个元素,同时过滤空行:

# 替换原取数代码
numbers_raw = wk.batch_get(('E3:E',))[0]
names_raw = wk.batch_get(('D3:D',))[0]

# 转换为一维列表
names = [item[0] for item in names_raw if item]
numbers = [item[0] for item in numbers_raw if item]

方法2:用get_values简化取数

直接用get_values获取列数据,再转换为一维列表:

# 获取D3到末尾的姓名列,转换为一维列表
names = [row[0] for row in wk.get_values('D3:D') if row]
# 获取E3到末尾的手机号列,转换为一维列表
numbers = [row[0] for row in wk.get_values('E3:E') if row]

方法3:循环内直接取值

如果不想提前处理列表,可在循环时直接访问子列表的第一个元素:

for i in range(len(names)):
    message = client.messages.create(
        to=numbers[i][0],  # 提取手机号
        from_='+18442251378',
        body=f"Hello {names[i][0]}, this is a test message from Twilio.")  # 提取姓名
    print(f"Message sent to {names[i][0]} at {numbers[i][0]}")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 04:15:49