"""
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,
})
"""