如何解决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
相关产品推荐
相关产品推荐

