跳到主要内容

关联有重复值的记录

信息

选定一条记录和要查重的列,脚本会自动查找其余重复记录,然后关联至选定记录(需要提前创建一个「单向关联」「双向关联」字段)

实际效果

duplicate-checker

源代码

const datasheet = await space.getActiveDatasheetAsync();

const storeField = await input.fieldAsync("请选择存储重复记录的字段,类型需要为单向关联或双向关联且关联的是当前表格:", datasheet);

if (storeField.type != 'TwoWayLink' && storeField.type != 'OneWayLink'){
output.text('运行失败:选择的字段类型需要为单向关联或双向关联');
} else if (storeField.property.foreignDatasheetId != datasheet.id) {
output.text('运行失败:选择的双向关联列必须关联本表');
} else {
console.log(storeField.property);

const needFindRecord = await input.recordAsync("请选择要查重的记录:", datasheet);
const needFindField = await input.fieldAsync("请选择要查重的字段:", datasheet);

const records = await datasheet.getRecordsAsync();

// 定义两个之后需要用到的数据集,duplicates 存储找到的重复记录 id,valuesMap 将存储用于更新双向关联列的数据
const duplicates = [];
const valuesMap = {}

for (let record of records) {
//为空的数据不属于要查找的内容,所以跳过
if (record.getCellValueString(needFindField.id) === null) {
continue;
}
//查重时需要排除自己
if (record.id === needFindRecord.id) {
continue;
}
//根据 getCellValueString 获取数据,判断是否相等,如果相等则代表两者重复
if (record.getCellValueString(needFindField.id) === needFindRecord.getCellValueString(needFindField.id)) {
duplicates.push(record.id)
}
}

console.log(duplicates);

if (duplicates.length === 0) {
output.text(`没有找到重复的记录`);
} else {
output.text(`找到了 ${duplicates.length} 条重复记录,已经双向关联列中关联`);
valuesMap[storeField.id] = duplicates
await datasheet.updateRecordAsync(needFindRecord.id, valuesMap);
}

}