1

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

输入电压 | 所有者 | 使用 | 地点

123 abc 测试 CA

456 xyz 产品 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]

使用 = [测试,产品]

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

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

4

2 回答 2

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

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

于 2021-11-09T14:08:34.853 回答
-1

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

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

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

于 2021-05-26T13:31:28.340 回答