使用列映射更快地查找列
发表在1月11日
说实话吧。当您使用Smartsheet API时,寻找正确的列可能很乏味。API为您提供了一个列对象数组,您可以通过循环查找匹配的对象columnName
你在寻找的东西。一旦找到所需的列,就可以获取columnId
——因为要通过API对列执行任何操作,您需要columnId
.
与Smartsheet JavaScript SDK您也可以通过调用来获取列getSheet ()
或getColumns ()
.在这种情况下,我们选择forgetSheet
.
要开始工作,请使用有效的对象初始化Smartsheet客户端对象访问令牌,并创建变量sheetId
,dateColumnName
,dateColumnId
.
常量客户端=需要(“内容”);常量内容=客户端.createClient({accessToken:smartsheet_access_token});常量sheetId=3378835908519812;常量dateColumnName=“生日”;//列的标题让dateColumnId=0;//变量保存列的id
使用内容
对象和sheetId
,获取工作表,遍历各列以找到Birthday列,并设置为的值dateColumnId
.
内容.表.getSheet({id:sheetId}).然后(函数(表){//对于dateColumnNames数组中列出的每个列标题,//获取该列的columnId并将其设置为dateColumnId为(让我=0;我<表.列.长度;我++){//当列标题与dateColumnName匹配时如果(表.列[我].标题= = =dateColumnName){//设置dateColumnIddateColumnId=表.列[我].id;打破;}}})
现在,使用for值dateColumnId
来访问生日列中的单元格。但是,当你要求另一列的id时会发生什么呢?您可以初始化更多的值来存储另一列的id和标题。然后,在列循环中添加另一个条件语句,以查找匹配的列标题。在所有这些之后,代码将变得非常混乱。让我们看一个更简洁的方法columnId
基于columnTitle
.属性的映射或键值对可以实现这一点columnTitle
作为钥匙和columnId
作为值。
在JavaScript中,创建此映射的最快方法是使用减少函数,一个高阶函数内置于Array.prototype
.如载于MDN网络文档reduce方法“执行一个reducer函数…在数组的每个成员上,产生单个输出值。”在本例中,该函数将把columns数组缩减为包含列标题和id的单个对象。
让我们回到响应getSheet
前面使用的函数。而不是循环sheet.columns
调用sheet.columns.reduce ()
.
常量columnMap=表.列.减少(reducerFunction,{});
在这个reduce函数中,传递了两个参数:reducerFunction
将在columns数组中的每个元素上执行,而{}
初始化累加器值。该累加器值将在每次reducerFunction
execute——它将在columns数组中的每个元素上执行。的reducerFunction
也会有两个参数,看起来像这样:
常量reducerFunction=(tempMap,上校)= >{tempMap[上校.标题]=上校.id;返回tempMap;}
tempMap
是初始化的累加器值吗{}
,上校
代表了列
正在被执行的对象数组元素。该函数使用列标题设置键,值为列id。当reduce ()
完成映射的结果如下所示。
{的名字:4615776901588868,生日:3489876994746244}
现在,要获取列的id,而不是遍历columns数组,只需调用columnMap
使用所需列的标题。
columnMap[“生日”];
这只是使应用程序代码更优雅的几种方法之一。请在下面的评论中告诉我们,如果你在使用Smartsheet API时遇到了其他令人痛苦的地方,或者如果你有任何优雅的解决方案想要与Smartsheet开发者社区分享。