WPS多维表的读取、写入、更新(修改),详见文档
评论
收藏

WPS多维表的读取、写入、更新(修改),详见文档

经验分享
云书
2025-12-06 09:49·浏览量:1517
云书
影刀高级开发者
发布于 2025-12-06 09:491517浏览

"""

WPS多维表Airscript脚本调用,需配合脚本使用,示例脚本在文件下方

"""

import http.client

import json

def create_records_any(title_list, values_list, sheet_name, link, url):

   """

   将内容写入wps多维表格指定sheet页

   Args:

       title_list: 多维表列名,类型为列表

       values_list: 多维表数据,类型为二维列表

       sheet_name: 表名

       link: 个人令牌

       url: 多维脚本webhook

   Returns:

       args: API写入结果

   """

   conn = http.client.HTTPSConnection("www.kdocs.cn")

   record_list=[{"fields":dict(zip(title_list,i))}  for  i  in  values_list]

   payload = {"Context":{"argv":{"sheet_name":sheet_name,"sheet_data":record_list}}}

   payload_json = json.dumps(payload)

   headers = {

       'Content-Type': "application/json",

       'AirScript-Token': link

       }

   conn.request("POST", url, payload_json, headers)

   res = conn.getresponse()

   data = res.read()

   args = data.decode("utf-8")

   return dealExecRes(args)

def read_records_any(sheet_name, link, url):

   """

   读取wps多维表格指定sheet页数据

   Args:

       sheet_name: 表名

       link: 个人令牌

       url: 多维脚本webhook

   Returns:

       result: 表格数据, 数据类型根据对应url的脚本输出设置决定, 多为二维列表或二维字典

   """

   conn = http.client.HTTPSConnection("www.kdocs.cn")

   payload = {"Context":{"argv":{"sheet_name":sheet_name}}}

   payload_json = json.dumps(payload)

   headers = {

       'Content-Type': "application/json",

       'AirScript-Token': link

       }

   conn.request("POST", url, payload_json, headers)

   res = conn.getresponse()

   data = res.read()

   args = data.decode("utf-8")

   result=json.loads(args)['data'].get('result',[])

   return result

def up_records_any(values_list, sheet_name, link, url):

   """

   更新(修改)wps多维表格指定sheet页数据

   Args:

       values_list:

           需要写入的表格, 格式为二维列表,一个子列表一行数据

           子列表格式为{'fields': {'表头1':'值1','表头2':'值2'},'id':'行id'}

           行id需要借助读取函数获取

       sheet_name: 表名

       link: 个人令牌

       url: 多维脚本webhook

   Returns:

       args: API写入结果

   """

   conn = http.client.HTTPSConnection("www.kdocs.cn")

   payload = {"Context":{"argv":{"sheet_name":sheet_name,"sheet_data":values_list}}}

   payload_json = json.dumps(payload)

   headers = {

       'Content-Type': "application/json",

       'AirScript-Token': link

       }

   conn.request("POST", url, payload_json, headers)

   res = conn.getresponse()

   data = res.read()

   args = data.decode("utf-8")

   return dealExecRes(args)

def dealExecRes(args_text):

   """

   多维表执行结果处理,简要打印处理结果,只返回布尔值

   Args:

       json: 多维表返回日志

   Returns:

       result: Boolean value

   """

   args_json = json.loads(args_text)

   error_value = args_json.get('error', '')

   if error_value == '':

       print('多维表执行成功')

       return True

   else:

       print('×××××××××××××××××××××多维脚本执行失败×××××××××××××××××××××')

       print('报错日志:',args_json.get('error_details', ''))

       return False

def original_format_to_2Dlist(original_format, title_list, save_row_id = False):

   """

   多维表return时未自定义格式直接输出,可将原始格式转换为二维列表

   Args:

       original_format: 原始格式

       title_list: 需要保留的表头

       save_row_id: 是否保存行id

   Returns:

       二维列表

   """

   if save_row_id:

       output_2d_list = [['写回id'] + title_list]

   else:

       output_2d_list = [title_list]

   for item in original_format:

       if not isinstance(item, dict):

           continue

       fields_data = item.get('fields', {}) # 容错处理

       if not isinstance(fields_data, dict):

           continue

       row = []

       if save_row_id: row.append(item['id']) #根据变量决定是否保留行ID

       for header in title_list:

           # 从 fields_data 中获取对应header的值,如果不存在则为 空字符串

           row_value = fields_data.get(header, '')

           row.append(row_value)

       output_2d_list.append(row)

   return(output_2d_list)

"""

########################### WPS多维表通用脚本 ############################

为便于查看,每行代码有多一个缩进,复制到Airscript粘贴后需要批量删除缩进才可使用

【多维写入】——————————————————————————————

   var sheet_name = Context.argv.sheet_name

   var sheet_data = Context.argv.sheet_data

   console.log(sheet_name)

   console.log(sheet_data)

   const 所有表数据 = Application.Sheet.GetSheets();

   const 所有表关键信息 = [];

   for (let i = 0; i < 所有表数据.length; i++) {

     const 本次查询表信息 = 所有表数据[i];

     const 表名称 = 本次查询表信息.name;

     const 表ID = 本次查询表信息.id;

     所有表关键信息.push({

       "名称": 表名称,

       "id": 表ID,

     });

     if (表名称 === sheet_name) {

       写入数据表ID = 表ID;

       console.log(写入数据表ID)

     }

   }

   var records = Application.Record.CreateRecords({

     SheetId: 写入数据表ID,

     Records: sheet_data

   })

【多维读取】,需要自定义输出类型  ——————————————————————————————

   var sheet_name = Context.argv.sheet_name

   var title = Context.argv.title

   //sheet_name = '' //调试表名,正式使用请注释或删除

   const 所有表数据 = Application.Sheet.GetSheets();

   const 所有表关键信息 = [];

   for (let i = 0; i < 所有表数据.length; i++) {

     const 本次查询表信息 = 所有表数据[i];

     const 表名称 = 本次查询表信息.name;

     const 表ID = 本次查询表信息.id;

     所有表关键信息.push({

       "名称": 表名称,

       "id": 表ID,

     });

     if (表名称 === sheet_name) {

       读取数据表ID = 表ID;

       console.log(读取数据表ID)

     }

   }

   const view = Application.Selection.GetActiveView()

   let all = []

   let offset = null;

   while (all.length === 0 || offset) {

     let records = Application.Record.GetRecords({

       SheetId: 读取数据表ID,

       Offset: offset,

       //需要筛选数据启用下方代码,op筛选方式详见 https://365.kdocs.cn/l/ctzsgDlAGF0l

       // Filter: {

       //   "criteria": [

       //     {

       //       "field": "你要筛选的列名",

       //       "op": "NotEmpty", //不为空的写法,其他筛选方式请自行查询文档

       //       "values": []

       //     }

       //   ]

       // }

     })

     offset = records.offset

     all = all.concat(records.records)

   }

   console.log(all)

   return all

   // 自定义禁用return,导出启用下方//此处用于自定义编辑输出格式,如有写回需要请保留item.id

   // const data_list = []

   // all.forEach(item => {

   //   // console.log(item)

   //原格式输出示例

   //   data_list.push({"fields": {'你要输出的列':item.fields.你要输出的列名},'id':item.id})

   // })

   //列表输出示例

   data_list.push([item.id(用于写回定位), item.fields.列名1, item.fields.列名2……])

   //自定义字典输出示例

   const key = item.fields.键名的列名

   const value = item.fields.键值的列名,可套一层列表或字典

   data_list.push({[key] : value})

   //字典列表输出示例

   data_list.push({'写回id':item.id, '列名1':item.fields.列名1,'列名2':item.fields.列名2……})

   // console.log(data_list)

   // return (data_list)

【多维表更新(修改)】 ——————————————————————————————

   var sheet_name = Context.argv.sheet_name

   var sheet_data = Context.argv.sheet_data

   const 所有表数据 = Application.Sheet.GetSheets();

   const 所有表关键信息 = [];

   for (let i = 0; i < 所有表数据.length; i++) {

   const 本次查询表信息 = 所有表数据[i];

   const 表名称 = 本次查询表信息.name;

   const 表ID = 本次查询表信息.id;

   所有表关键信息.push({

       "名称": 表名称,

       "id": 表ID,

   });

   if (表名称 === sheet_name) {

       读取数据表ID = 表ID;

       console.log(读取数据表ID)

   }

   }

   console.log(sheet_data)

   const data_up = Application.Record.UpdateRecords({

       SheetId: 读取数据表ID,

       Records: sheet_data,

   })

"""

收藏10
全部评论1
最新
发布评论
评论