与smartsheet api交互的python库
simple-smartsheet的Python项目详细描述
简单的智能工作表
python库可以轻松地与smartsheet api交互
安装
需要python 3.6+pip安装简单的智能工作表
为什么不使用smartsheet python sdk
smartsheet python sdk
具有非常广泛的对象覆盖范围,并很好地映射到smartsheet api,但它没有一些方便的功能(例如,通过列标题轻松访问单元格)。简单的智能工作表
库以牺牲功能覆盖范围为代价,关注用户体验。
到目前为止,您只能与工作表和报表及其子对象(行、列、单元格)交互。
此外,简单智能工作表
支持异步,同时提供同步和异步API。
用法
importosfromdatetimeimportdatefrompprintimportpprintfromsimple_smartsheetimportSmartsheetfromsimple_smartsheet.modelsimportSheet,Column,Row,Cell,ColumnTypeTOKEN=os.getenv("SMARTSHEET_API_TOKEN")SHEET_NAME="[TEST] My New Sheet"smartsheet=Smartsheet(TOKEN)# retrieve a list of sheets (limited set of attributes)sheets=smartsheet.sheets.list()pprint(sheets)# delete the test sheet if already existsforsheetinsheets:ifsheet.name==SHEET_NAME:smartsheet.sheets.delete(id=sheet.id)# create a new Sheetnew_sheet_skeleton=Sheet(name=SHEET_NAME,columns=[Column(primary=True,title="Full Name",type=ColumnType.TEXT_NUMBER),Column(title="Number of read books",type=ColumnType.TEXT_NUMBER),Column(title="Birth date",type=ColumnType.DATE),Column(title="Library member",type=ColumnType.CHECKBOX),],)# print the sheet object attributes used by the Smartsheet API (camelCase)pprint(new_sheet_skeleton.dump())# add the sheet via APIresult=smartsheet.sheets.create(new_sheet_skeleton)sheet=result.objprint(f"ID of the created sheet is {sheet.id!r}")# retrieve a sheet by name# this object is exactly the same as result.objsheet=smartsheet.sheets.get(SHEET_NAME)# get columns details by column title (case-sensitive)full_name_column=sheet.get_column("Full Name")pprint(full_name_column.__dict__)num_books_column=sheet.get_column("Number of read books")pprint(num_books_column.__dict__)# add rows (cells are created using different ways)# second way is the easiestnew_rows=[Row(to_top=True,cells=[Cell(column_id=full_name_column.id,value="Alice Smith"),Cell(column_id=num_books_column.id,value=5),],),Row(to_top=True,cells=sheet.make_cells({"Full Name":"Bob Lee","Number of read books":2}),),Row(to_top=True,cells=[sheet.make_cell("Full Name","Charlie Brown"),sheet.make_cell("Number of read books",1),sheet.make_cell("Birth date",date(1990,1,1)),],),]smartsheet.sheets.add_rows(sheet.id,new_rows)# sort rows by column "Full Name" descending / returns updated sheetsheet=smartsheet.sheets.sort_rows(sheet,[{"column_title":"Full Name","descending":True}])print("\nSheet after adding rows:")# print a list of dictionaries containing column titles and values for each rowpprint(sheet.as_list())# get a specific cell and updating it:row_id_to_delete=Nonerows_to_update=[]forrowinsheet.rows:full_name=row.get_cell("Full Name").valuenum_books=row.get_cell("Number of read books").valueprint(f"{full_name} has read {num_books} books")iffull_name.startswith("Charlie"):updated_row=Row(id=row.id,cells=[sheet.make_cell("Number of read books",15)])rows_to_update.append(updated_row)eliffull_name.startswith("Bob"):row_id_to_delete=row.id# used later# update rowssmartsheet.sheets.update_rows(sheet.id,rows_to_update)# or a single row# smartsheet.sheets.update_row(sheet.id, rows_to_update[0])# get an updated sheetsheet=smartsheet.sheets.get(id=sheet.id)print("\nSheet after updating rows:")pprint(sheet.as_list())# delete a rowsmartsheet.sheets.delete_row(sheet.id,row_id_to_delete)# get an updated sheetsheet=smartsheet.sheets.get(id=sheet.id)print("\nSheet after deleting rows:")pprint(sheet.as_list())# delete a sheet by namesmartsheet.sheets.delete(SHEET_NAME)sheets=smartsheet.sheets.list()pprint(sheets)
API参考
当一个单独的文档页面正在工作时,此处将介绍可用的公共api
类简单智能工作表.smartsheet
这是图书馆的A级主要入口点
方法:
def\uu init(token:str)
:类的构造函数
属性:
令牌
:在个人设置中获取的SmartSheet API令牌->;API访问工作表
:simple_smartsheet.models.sheet.sheetcrud
对象,它提供与工作表交互的方法报表
:simple_smartsheet.models.report.reportcrud
提供与报表交互方法的对象
类简单智能工作表.models.sheet.sheetcrud
方法:
def get(name:optional[str],id:optional[int])->;工作表
:按名称或id获取工作表。def list()->;list[工作表]
:获取所有工作表的列表(仅摘要)def create(obj:sheet)->;结果
:添加新工作表def update(obj:sheet)->;结果
:更新工作表def delete(name:optional[str],id:optional[int])->;结果
:按名称或id删除工作表def add_rows(工作表id:int,rows:sequence[row])->;结果
:向工作表添加行def add_row(工作表id:int,row:row)->;结果
:向工作表中添加一行def update_rows(sheet_id:int,rows:sequence[row])->;结果
:更新工作表中的几行def update_row(sheet_id:int,row:row)->;结果
:更新一行def delete_rows(sheet_id:int,row_id:sequence[int])->;结果
:删除具有提供的id的多行def delete_row(sheet_id:int,row_id:int)->;结果
:删除具有所提供id的单行def sort_rows(sheet:sheet,order:list[dict[str,any]])->;工作表
:按指定顺序对工作表行排序,例如:
sheet.sort_rows([
{"column_title": "Birth date", "descending": True},
{"column_title": "Full Name"}
])
类简单智能工作表.models.sheet.sheetAsyncCrud
下面列出的方法是sheetcrud
中方法的异步版本,为完整性列出:
异步def get(名称:可选[str],id:可选[int])->;工作表
异步定义列表()->;列表[工作表]
异步定义创建(obj:sheet)->;结果
异步定义更新(obj:sheet)->;结果
异步def delete(名称:可选[str],id:可选[int])->;结果
异步定义添加行(工作表id:int,行:序列[行])->;结果
异步定义添加行(工作表id:int,行:row)->;结果
异步定义更新行(工作表id:int,行:序列[行])->;结果
异步定义更新行(工作表id:int,行:row)->;结果
异步定义删除行(工作表id:int,行id:sequence[int])->;结果
异步定义删除行(工作表:int,row_id:int)->;结果
异步定义排序行(sheet:sheet,order:list[dict[str,any]])->;sheet
类简单智能工作表.models.sheet
属性(从camelcase转换为snake_case):
方法:
def get_row(row_num:optional[int],row_id:optional[int],filter:optional[dict[str,any]])->;optional[row]
:如果生成了唯一索引,则按行号、id或按筛选器返回行对象(请参阅"自定义索引"部分)def get_rows(index_query:dict[str,any])->;list[row]
:如果已生成索引,则按筛选器返回行对象列表(请参阅"自定义索引"部分)def get_column(column_title:可选[str],column_id:可选[int])->;column
:按列标题或id返回列对象def build_index(index:list[indexkeysdict])->;none
:使用get_row
或get_rows
生成一个或多个用于快速行查找的索引,例如:
sheet.build_index([
{"columns": ("Company Name",), "unique": False},
{"columns": ("Company Name", "Full Name"), "unique": True}
])
def make_cell(column_title:str,field_value:union[float,str,datetime,none])->;单元格
:创建具有提供的列标题和关联值的单元格对象def make_cells(字段:dict[str,union[float,str,datetime,none]])->;list[cell]
:从输入字典创建单元格对象列表,其中列标题是与字段值关联的键def as_list()->;list[dict[str,any]]
:返回一个字典列表,其中列标题是与字段值相关联的键
类简单智能工作表.models.row.row
属性(从camelcase转换为snake_case):
方法:
def get_cell(column_title:optional[str],column_id:optional[int])->;cell
-按列标题(区分大小写)或列ID返回单元格对象def as_dict()->;dict[str,any]
-返回列标题到单元格值映射的字典
类简单智能工作表.models.column.column
属性(从camelcase转换为snake_case):
类简单智能工作表.models.cell.cell
属性(从camelcase转换为snake_case):
类简单智能工作表.models.extra.result
:
属性(从camelcase转换为snake_case):
- https://smartsheet platform.github.io/api docs/result object
result
属性被重命名为obj
以避免调用result.result
的混淆。结果
属性仍然通过属性可用
类简单智能工作表.models.report
属性(从camelcase转换为snake_case):
实现以下工作表方法:
def get_row(row_num:optional[int],row_id:optional[int],filter:optional[dict[str,any]])->;reportrow
:按行号、id或f返回reportrow对象如果构建了唯一索引(请参阅"自定义索引"一节),则为筛选器def get_rows(index_query:dict[str,any])->;list[reportrow]
:如果生成了索引,则按筛选器返回reportrow对象的列表(请参阅"自定义索引"部分)def get_column(column_title:可选[str],column_id:可选[int])->;reportcolumn
:按列标题或id返回reportcolumn对象def build_index(index:list[indexkeysdict])->;none
:使用get_row
或get_rows
生成一个或多个用于快速行查找的索引,例如:
sheet.build_index([
{"columns": ("Company Name",), "unique": False},
{"columns": ("Company Name", "Full Name"), "unique": True}
])
def as_list()->;list[dict[str,any]]
:返回一个字典列表,其中列标题是与字段值相关联的键
自定义索引
可以建立索引以启用对工作表和报表的快速行查找。为此,在检索工作表之后,调用sheet.build_index
函数。它只需要一个参数:字典列表,其中每个字典都有两个键列
和
唯一
。
列
应包含具有列标题的元组(区分大小写)。unique
控制索引是否始终指向一行(valuetrue
,查找使用get_row
方法)或多行(valuefalse
,查找使用get_rows
方法)。
下面您可以找到一个代码片段(参见examples/custom_index.py
中的完整示例):
INDEXES=[{"columns":("Company",),"unique":False},{"columns":("Company","Full Name"),"unique":True},{"columns":("Email address",),"unique":True},]sheet=smartsheet.sheets._get("[TEST] Index Sheet")sheet.build_index(INDEXES)print("\nRow where email address is 'charlie.brown@globex.com':")print(sheet.get_row(filter={"Email Address":"charlie.brown@globex.com"}).as_dict())# ># {'Company Name': 'Globex',# 'Email Address': 'charlie.brown@globex.com',# 'Full Name': 'Charlie Brown'}print("\nRows where the company name is 'ACME':")print([row.as_dict()forrowinsheet.get_rows(filter={"Company Name":"ACME"})])# ># [{'Company Name': 'ACME',# 'Email Address': 'alice.smith@acme.com',# 'Full Name': 'Alice Smith'},# {'Company Name': 'ACME',# 'Email Address': 'bob.lee@acme.com',# 'Full Name': 'Bob Lee'}]
异步
库支持所有I/O方法的异步,而不是调用:
smartsheet = Smartsheet(token)
sheet = smartsheets.sheets.get('my-sheet')
您需要使用异步版本的SmartSheet类调用异步上下文管理器:
with AsyncSmartsheet(token) as smartsheet:
sheet = await smartsheet.sheets.get('my-sheet')
在examples/async.py