【问题标题】:Access Smartsheet by column Name instead of Column Id按列名称而不是列 ID 访问 Smartsheet
【发布时间】:2021-05-26 07:00:32
【问题描述】:

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

Vin |所有者 |使用 |位置

123 abc test 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)

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

输入电压 = [123, 456]

所有者 = [abc, xyz]

使用 = [测试,产品]

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

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

【问题讨论】:

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


    【解决方案1】:

    来自文档:要按名称调用列,您可以创建一个小函数来读取所有名称并为您制作一个小矩阵:

    def get_new_cell_by_column_name(cells, column_name):
        column_id = s_column_map_new[column_name]
        return cells.get_column(column_id)
    

    然后在需要 ID 时调用矩阵:

    new_cell_id = get_new_cell_by_column_name(row_object, "Name of the Column")
    

    或者当你需要你刚刚添加的值时:

    cell_value = new_cell_id.value
    

    为避免更改列名,请为一般用户使用报告,并且仅向需要添加或编辑信息的用户授予对原始工作表的编辑访问权限。

    【讨论】:

    • 请考虑添加上面反映的关于在智能表中使用这些功能的风险的 cmets
    • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
    【解决方案2】:

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

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

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

    【讨论】:

    • 布兰迪 感谢您的回复。我是这里的新手,你能帮忙分享一个我的用例的示例代码(基于上面分享的代码)吗?
    • 嗨,Brandi - 我同意这个建议,但如果您有任何示例,请提供上述示例或更正。否则,这应该在问题的评论部分中,而不是作为答案。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-26
    • 1970-01-01
    • 1970-01-01
    • 2019-04-27
    • 2015-06-17
    • 1970-01-01
    相关资源
    最近更新 更多