按列名称而不是列 ID 访问 Smartsheet

时间:2021-05-26 07:00:32

标签: python smartsheet-api smartsheet-api-1.1

我是使用 Smartsheet 的新手,我正在尝试访问列的值并将它们存储在列表中,并且我能够通过索引访问这些值。在我的用例中,人们可以从智能表中删除随机列,这可能会导致我的索引编号在读取数据时受到影响。例如 - 我的智能表如下所示:

葡萄酒 |业主 |使用 |位置

123 abc 测试 CA

456 xyz prod TX

我目前用来访问数据的代码是:

import smartsheet
from simple_smartsheet import Smartsheet
from simple_smartsheet.models import Sheet, Column, Row, Cell, ColumnType
from pprint import pprint
import pandas as pd
import re
import sasl
import json
from fastparquet import write
# from influxdb import InfluxDBClient
import thrift_sasl
import prestodb
import s3fs
import boto3
from pyhive import hive

smartsheet = smartsheet.Smartsheet('adjgdjcdjchbdclkcn')


# Get current user
#user_profile = smartsheet.Users.get_current_user()

# Get all columns.
MySheet = smartsheet.Sheets.get_sheet(1234567891234567)

Vin = []
Owner = []
Use = []
Location = []

def Data():
 for RowIndex in range(0, len(MySheet.rows)):
           Vin.append(MySheet.rows[RowIndex].cells[2].display_value)
           Use.append(MySheet.rows[RowIndex].cells[3].display_value)
           Owner.append(MySheet.rows[RowIndex].cells[4].display_value)
           Location.append(MySheet.rows[RowIndex].cells[5].display_value)
print(Vin)
print(Use)
Print(Owner)
Print(Location)

我想要的结果是(使用列名而不是索引):

Vin = [123, 456]

所有者 = [abc, xyz]

使用 = [测试,生产]

位置 = [加利福尼亚州,德克萨斯州]

现在不是按索引访问值,而是如何使用列名将值附加到列表中?非常感谢任何帮助或领导。提前谢谢你!

1 个答案:

答案 0 :(得分:0)

按名称引用(在代码中)列不是一个好主意。正如您已经指出,如果用户删除工作表中的列,索引可能会发生变化,如果用户重命名工作表中的列,列名也会发生变化。唯一确定列的方法是通过它的 ID,因为一旦创建了一个列,它的 ID 永远不会改变——无论它的索引、名称、数据类型或关于该列的任何其他内容是否改变,列 ID 都将始终保持不变。

如果这是一次性方案——即,您正在处理的工作表已经存在,并且将是您需要像这样处理的唯一工作表——那么我建议您发出 {{ 3}} 请求(使用 List Columns 或类似工具)来识别您有兴趣处理的列的 ID,然后在您的代码中使用这些 ID 来引用这些列。

或者——如果您需要您的解决方案能够随着时间的推移动态查找新工作表的列 ID(而不是您必须手动获取 ID),并且您有理由确定您感兴趣的列名称随着时间的推移,您处理的每个新工作表中都会存在 in 将存在(例如,Vin、所有者、使用、位置),您可以让您的代码发出 List Columns 请求,并处理存储 ID 的响应您感兴趣的列名,如果没有找到您感兴趣的任何列名(工作表中不存在),则会抛出错误。