很多小伙伴在使用扣子的飞书多维表插件时最头疼的就是入参的拼接,呼吁官方快点优化吧,小白表示看不懂。。。
最近搭建了一套基于飞书+coze的作业自动下发系统,里面用到了多次飞书插件。结合自己的使用场景聊一聊到底怎么样快速拼接好插件需要的参数。
1、写入多维表前的代码处理逻辑用户这个插件的人应该都清楚,一般在写入前都需要经过代码的格式化,否则就是各种报错,各种无法写入。那么如何去更快的生成符合要求的输入呢?
两种方式:1)使用大模型;2)使用代码
大模型方式:就是按照飞书插件字段要求的样子拼接出一个示例即可。


上图是add_records插件的入参部分,我们可以看到records字段要求的格式为[{}],再看看官方示例,也是[{}]。
当前我不知道它是列表还是数组等等格式。但是我知道上一个节点的输出一定也要是这个样子的。
下图是飞书插件上一节点的样式,Array<Object>也是[{}],那肯定我得选择它,
再看上图官方示例,[{}]包裹着一个fields,后面还跟着一个{},那就再输出里再加一个fields,并且选择带{}的格式。

大模型提示词怎么写呢?也是看着官方样例来。
"fields": "{\"文本\":\"文本内容\",\"单选\":\"选项 1\",\"日期\":1674206443000}"官方样例给的{}里面的数据格式是 "***":"***",这里就需要理解下了,这个叫做键值对,对应在多维表里就是
"列名":"这个列的字段值",想在哪列插入数据就写哪列,中间用逗号隔开即可。接下来就是给大模型提示词了,很简单将你希望的输出样式作为例子给它就好。(我这里特意用了中文的列名,说明它是支持的,不用非要写英文或者汉语拼音)

接着说第二种方法,写代码,我又不是程序员,我不会代码啊。没关系,有AI啊。大模型的方式你会了吧,如果你不需要提升处理速度,那么就有大模型的方式即可。但是你想更快的获取到结果,那么就需要用到代码了。
刚才大模型运行成功了,会有输出吧,把它复制出来,扔给AI,告诉它我需要代码。

接下来就会看到大模型劈里啪啦的输出一堆内容,最后给出了你代码。

这个后我突然发现,它给的代码和“代码插件”中的样式不太一样,那就再说一句话。并且把代码插件中的样例扔给它。很快你需要的代码就来了。


对于飞书数据的读取与写入正好相反,读取的重点是如何让下游节点更好的使用到飞书的数据。
读取多维表数据主要用到了3个参数,如下图:

app_token:没什么可说的,官方希望填的是多维表的唯一索引,但是它又支持url,所以直接写url最方便。
field_names:把需要查询的内容使用[]括起来,多个值就用逗号分隔。
filter:重点说一下这个字段该怎么写,也可以查看飞书开发文档https://open.feishu.cn/document/home/index,打开文档后在里面搜索search_record。
filter中包括:conjunction、conditions、automatic_fields(一般用不到,不考虑)
{ "conjunction": "and", #可以填写两个值 and \ or ; and:满足全部条件;or:满足任一条件 "conditions": [ { "field_name": "状态", #field_name多维表里的列名 "operator": "is", #条件运算符,比较多见下图 "value": ["0"] #条件的值,可以是单个值或多个值的数组 } ]}
search_record的输出数据保留在items里面,这里包括两个值fields和record_id,而我们只需要fields中的内容,所以分两步处理,首先格式化输出,提取出fields

这个是通用代码,只要是获取多维表数据去掉record_id,都可以直接复制即可。
async function main({ params }: Args): Promise<Output> { // 提取 input 数组中的 fields const fields = params.input?.map(item => item.fields) || []; // 提取所有 fields // 构建输出对象,将 fields 数组作为返回值 const ret = { fields: fields }; return ret;}获取到fields的值后,在图上可以看到内容写在了一起,接下来的代码是用于将里面的内容进行拆分。也是通用代码
async function main({ params }: Args): Promise<Output> { // 1. 解析第一个输入项 const inputItem = params.input?.[0] || "{}"; const parsedData = JSON.parse(inputItem); // 2. 按内容层级提取text字段 const extractText = (key: string) => parsedData[key]?.[0]?.text?.trim() || ""; // 上面不用动,如果你的输入不是input,就改为你自己的输入名称,其他不动 // 3. 构建结果对象 const resultObject = { one: extractText("内容1"), // one输出字段名按需修改,“内容1”就是你的列名,是什么就写什么 two: extractText("内容2"), //和上面一样,如果只有一个值就删了它 three: extractText("内容3") //和上面一样,如果只有一个值就删了它 }; // 4. 返回结构化结果 return { animals: [resultObject] //返回的列表名称,根据你的输出将animals修改即可。 }; }