WPS AirScript脚本合集(十四):判断查找引用字段是否包含关键信息

一、应用场景

多维表格中存在2个数据表,数据表A中存在一个查找引用字段,引用数据表B中的字段,此时需要判断识别查找引用字段中包含关键字的数据记录

举个栗子🌰,假设在“角色标签”表中存在两个文本字段,分别记录人员名称和对应的人员标签;在“人员角色定位”表中存在文本字段“人员”,以及查找引用字段“人员标签-查找引用”,引用“角色标签”中的“人员标签”字段,此时需要判断识别出人员标签中含有关键字“善良”的数据记录

如果通过公式查询,公式内容为IF(ISNUMBER(SEARCH("善良",[@人员标签-查找引用])),"是","否"),此时无法判断识别出查找引用字段包含关键字的数据记录

但若将查找引用字段转化为文本字段,使用相同的公式内容IF(ISNUMBER(SEARCH("善良",[@人员标签-文本])),"是","否"),则可以判处识别出文本字段包含关键字的数据记录

如若“角色标签”表中内容有所更新,通过查找引用字段可以随之自动更新,但文本字段则不能,

因此通过公式查询无法判断识别出查找引用字段中包含关键字的数据记录,那就通过脚本来实现啦

二、多维表格数据表及字段结构

2.1 “角色标签”表

1、表名:角色标签

2、视图名:表格视图

3、字段设置:

◉ 字段名称:人员 - 字段类型:文本 - 禁止录入重复值:否 - 默认值:无;

◉ 字段名称:人员标签 - 字段类型:文本 - 禁止录入重复值:否 - 默认值:无;

2.2 “人员角色定位”表

1、表名:人员角色定位

2、视图名:表格视图

3、字段设置:

◉ 字段名称:人员 - 字段类型:文本 - 禁止录入重复值:否 - 默认值:无;

◉ 字段名称:人员标签-查找引用 - 字段类型:查找引用 - 需要引用的字段:角色标签 人员标签 - 查找条件:人员 等于 人员;

◉ 字段名称:是否含关键字(脚本判断) - 字段类型:文本 - 禁止录入重复值:否 - 默认值:无;

◉ 字段名称:自动化执行结果 - 字段类型:文本 - 禁止录入重复值:否 - 默认值:无;

三、AirScript脚本直接运行

微信公众号文章详见https://mp.weixin.qq.com/s/VGU562j9NGlVfjitvdvULg

可直接在脚本编辑器中运行,无需结合自动化流程执行脚本,具体代码如下:

// 1. 获取当前目标表信息
const sheetId = Application.Sheets("人员角色定位").Id;
console.log("当前表ID:", sheetId);

// 2. 分页查询所有记录(超过1000行)
let allRecords = [];
let offset = null;

do {
  const pageResult = Application.Record.GetRecords({
    SheetId: sheetId,
    PageSize: 1000, // 每次获取最大1000条
    Offset: offset,
    Fields: ["人员标签-查找引用"] 
  });

  allRecords = allRecords.concat(pageResult.records);
  offset = pageResult.offset;
} while (offset);
console.log("当前表所有记录“人员标签”字段的值:", allRecords);

// 3. 为每条记录判断标签并准备更新数据
const updateRecords = [];

allRecords.forEach(record => {
  const labels = record.fields["人员标签-查找引用"];
  let tagStatus = "无关键字"; // 默认值

  // 使用for循环判断标签数组是否包含关键字
  if (labels && Array.isArray(labels)) {
    // 遍历标签数组
    for (let i = 0; i < labels.length; i++) {
      const label = labels[i];
      // 检查标签是否包含关键字
      if (label && label.includes("善良")) {
        tagStatus = "含关键字";
        break; // 找到一个匹配即可退出循环
      }
    }
  }

  // 准备更新记录数据(只更新目标字段)
  updateRecords.push({
    id: record.id,
    fields: {
      "是否含关键字(脚本判断)": tagStatus
    }
  });
});

console.log("待更新记录数:", updateRecords.length);

// 4. 分批更新记录(每次最多100条)
const BATCH_SIZE = 100;
for (let i = 0; i < updateRecords.length; i += BATCH_SIZE) {
  const batch = updateRecords.slice(i, i + BATCH_SIZE);

  Application.Record.UpdateRecords({
    SheetId: sheetId,
    Records: batch
  });

  console.log(`已更新 ${Math.min(i + BATCH_SIZE, updateRecords.length)}/${updateRecords.length} 条记录`);
}

console.log("所有记录更新完成!");

3.1 代码逻辑解释

1. 获取目标表格ID

  • Application.Sheets() 定位名为“人员角色定位”的电子表格,获取其唯一标识符 sheetId

  • 输出 sheetId 便于调试,确保后续操作基于正确的表格。

2. 分页查询所有记录

  • 分页机制OffsetPageSize 协同工作,每次拉取1000条记录,直到全部数据获取完毕。

  • 字段筛选:仅请求 人员标签-查找引用 字段,减少数据传输量,提升效率。

  • 结果合并:所有分页数据最终合并到 allRecords 数组中。

3. 标签分析与更新数据准备

  • 高效匹配:使用 Array.isArray 验证数据类型,for 循环遍历标签数组,匹配到关键字后通过 break 终止循环,减少无效计算。

  • 状态标记:根据匹配结果设置 tagStatus,未匹配时保留默认值“无关键字”。

  • 更新数据封装:仅更新目标字段 是否含关键字(脚本判断),避免修改其他数据。

4. 分批更新记录

  • 批量处理:每批最多100条记录(BATCH_SIZE),通过循环切割数组分批提交。

  • 进度反馈:实时输出更新进度,便于监控执行状态。

  • 健壮性设计Math.min() 确保最后一批数据不越界。

3.2 注意事项

图中绿色方框中内容需根据实际情况进行修改

3.3 脚本运行输出示例

四、自动化流程执行AirScript脚本

通过创建自动化流程执行AirScript脚本,可实现新增或修改记录时自动判断识别含关键字的数据记录

4.1 自动化流程配置

4.2 AirScript脚本

try {
  const recordid = Context.argv.recordid[0]; 
  console.log("当前记录ID:", recordid);
  const sheetid = Context.argv.sheetid[0];
  console.log("当前表ID:", sheetid);
  const labels = Application.Sheets("人员角色定位").Views("表格视图").RecordRange(recordid, "@人员标签-查找引用").Value
  console.log("所有标签的值:", labels);
  
  // 判断逻辑 - 使用for循环
  let result = "无关键字";
  if (labels && Array.isArray(labels)) {
    // 使用for循环遍历标签数组
    for (let i = 0; i < labels.length; i++) {
      const label = labels[i];
      // 检查标签是否包含关键字
      if (label.includes("善良")) {
        result = "含关键字";
        break; // 找到一个匹配即可退出循环
      }
    }
  }
  
  console.log("判断结果:", result);
  
  // 更新记录字段
  Application.Record.UpdateRecords({
    SheetId: sheetid,
    Records: [{
      id: recordid,  // 使用当前记录的ID
      fields: {
        "是否含关键字(脚本判断)": result
      }
    }],
  });
  
  return { status: `${new Date().toLocaleString()} success 判断结果已写入` };
  
} catch (error) {
  console.error("判断结果写入失败:", error);
  console.error("错误详情:", JSON.stringify({
    message: error.message,
    stack: error.stack
  }));
  return { status: `${new Date().toLocaleString()} error 判断结果写入失败:数据处理过程中发生异常`};
}

4.2.1 代码逻辑解释

1. 初始化与参数获取

  • 通过 Context.argv 接收外部传入的 recordidsheetid,用于定位具体记录和表格。

2. 标签数据查询

  • 调用表格 API 获取指定记录的“人员标签-查找引用”字段值(预期为数组)。

3. 关键字判断逻辑

  • 类型验证Array.isArray(labels) 确保后续操作安全,避免非数组类型错误。

  • 高效匹配for 循环 + break 在首次匹配后立即退出,减少无效遍历。

  • 包含性检查includes("善良") 支持部分匹配。

4.结果回写与响应

  • 将判断结果更新到原记录的指定字段,并返回成功状态。

5. 错误处理机制

  • 错误隔离try-catch 包裹核心逻辑,确保单点故障不影响整体流程。

  • 详实日志:输出 error.messageerror.stack 提供完整的调试信息。

  • 状态区分:返回 error 前缀状态码,便于外部系统识别失败。

4.2.2 注意事项

图中绿色方框中内容需根据实际情况进行修改

4.3 自动化流程执行脚本输出示例

广东省
浏览 1416
1
3
分享
3 +1
2
1 +1
全部评论 2
 
你美而不能思议
学习
· 四川省
回复
bokuto
· 广东省
回复