AppSheet打卡Bot未更新现有行问题排查求助
问题描述
我正在制作员工打卡签到签退的Form视图,所有数据存储在Google Sheet的「Staff」工作表中。当前遇到问题:用户签退时,配置的Bot未更新已存在的签到行,反而新增了一行数据。我已设置2个Action和1个Bot,意图在「Staff」表数据变更时写入现有行,但未成功。以下是相关配置和错误信息,求排查问题根源。
Staff表设置
[Staff表配置截图]
Check Out Action设置
[Check Out Action配置截图]
Referenced Rows 公式:
SELECT( STAFF[_ROWNUMBER], AND( [Name] = USEREMAIL(), [Date] = TODAY(), [Branch] = [_THISROW].[Branch], ISBLANK([Time Out]) ) )
Set Check out time Action设置
[Set Check out time Action配置截图]
Bot设置
[Bot配置截图1]
[Bot配置截图2]
Event Condition 公式:
Not(ISBLANK( ANY( SELECT( Staff[Time In], AND( [Date] = TODAY(), [Branch] = [_THISROW].[Branch], [Name] = USEREMAIL() ) ) ) ))
Bot测试错误信息
Failed: Error: 'Execute an Action on a Set of Rows' Data action 'Check Out' for table 'Staff failed with exception Cannot get key values when Parent or ChangeImage are null. { "$type": "Nirvana.Data.TaskResultTakeAction, V2API", "AppWorkflowRuleOrProcessName": "Process for Auto Check-In/Check-Out - 2", "ActionName": "Check Out", "Changes": { "$id": "1", "$type": "ChangeOperations.Changes, ChangeOperations", "ListChanges": [ { "$id": "2", "$type": "ChangeOperations.Change, ChangeOperations", "AfterImage": [ "6", "eexxx@gmail.com", "05/18/2024", "TBP", "", "13:16:00", "336:00:00", "10", "", "", "" ], "AfterImageOriginal": null, "BeforeImage": null, "BeforeImageOriginal": null, "ChangeImage": null, "ChangeImageToLog": [], "ChangeImageSavedImages": null, "ProcessStateDataChange": null, "MustReadBeforeOrAfterImage": false, "OpTypePerformed": "Update", "TableName": null } ] }, "AppErrors": { "$type": "Jeenee.DataTypes.AppErrors, Jeenee.DataTypes", "RecordInfo": false, "RecordWarning": true, "AnnotateErrors": false, "Errors": [] }, "TaskType": "TakeAction", "TaskName": "Check Out" }
问题分析与修复方案
1. 核心错误原因
错误提示Cannot get key values when Parent or ChangeImage are null表明:Bot执行更新操作时无法定位到目标行,要么是Referenced Rows公式未返回有效行,要么是表的主键配置缺失。
2. 具体排查点
- 主键配置缺失:AppSheet依赖主键唯一识别行,若「Staff」表未设置主键(如
_ROWNUMBER或自定义唯一ID列),更新操作会默认转为新增行。 - Referenced Rows公式逻辑漏洞:
[_THISROW].[Branch]依赖触发Bot的表单行Branch值,若该值为空或与签到行Branch不匹配,将无法定位目标行。- 需确认
USEREMAIL()返回值与签到行Name列值完全一致(含大小写、邮箱后缀)。 TODAY()是纯日期值,若签到行Date列为带时间的datetime格式,会导致日期匹配失败。
- Bot触发逻辑不准确:当前Event Condition仅判断存在签到记录,但未限定触发场景为签退动作,可能导致非签退操作触发Bot,引发逻辑混乱。
3. 修复步骤
- 配置表主键:打开「Staff」表设置,指定主键列(推荐用
_ROWNUMBER或自动生成的唯一ID)。 - 修正Referenced Rows公式:
替换[_THISROW].[Branch]为稳定的分支来源(如用户配置表中的默认分支),同时确保日期匹配逻辑兼容datetime格式:SELECT( STAFF[_ROWNUMBER], AND( [Name] = USEREMAIL(), DATE([Date]) = TODAY(), -- 提取日期部分匹配,忽略时间 [Branch] = LOOKUP(USEREMAIL(), Users[Email], Users[Branch]), -- 从用户表获取固定分支 ISBLANK([Time Out]) ) ) - 优化Bot触发条件:添加签退动作判断,比如限定
NOT(ISBLANK([Time Out]))或表单特定状态字段,确保Bot仅在签退时触发。 - 单独测试Action:手动传入参数测试
Check OutAction,验证是否能正确找到目标行并完成更新。
内容的提问来源于stack exchange,提问作者Junekuan
相关产品推荐
相关产品推荐

