Dynamics 365字段变更时自动保存表单的脚本报错问题排查
Dynamics 365自动保存脚本错误排查
脚本存在的核心问题
- 缺失字段存在性校验:代码直接调用
formContext.getAttribute("logdate"),如果字段名拼写错误、该字段未添加到当前表单,会触发null引用错误,直接导致脚本崩溃。 - 无限循环风险:调用
formContext.data.save()会触发表单保存事件,若该脚本绑定的是字段OnChange或表单OnSave事件,保存操作会再次触发脚本执行,形成无限循环,最终引发系统报错。 - SaveMode参数使用不当:
saveMode:70对应系统自动保存模式,手动调用该模式易与系统默认自动保存逻辑冲突,可能导致异常。
修复后的脚本
function autosaveWhenFieldIsDirty(formContext) { // 先校验字段是否存在 var logDateField = formContext.getAttribute("logdate"); if (!logDateField) { console.error("字段logdate不存在或未添加到当前表单"); return; } var isFieldDirty = logDateField.getIsDirty(); // 过滤保存操作触发的重复执行,避免无限循环 var saveEventArgs = formContext.data.entity.getSaveEventArgs(); if (saveEventArgs && saveEventArgs.getSaveMode() === 70) { return; } var saveOptions = { saveMode: 2 // 使用快速保存模式,更适合手动触发场景 }; if (isFieldDirty) { formContext.data.save(saveOptions).then( function (success) { console.log("保存成功:", success); }, function (error) { console.error("保存失败:", error); } ); } }
修复说明
- 新增字段存在性检查,提前拦截null引用错误
- 增加保存事件判断,过滤系统保存触发的重复执行,彻底避免无限循环
- 将SaveMode替换为
2(快速保存),更适配手动触发保存的业务场景,减少与系统默认逻辑的冲突
内容的提问来源于stack exchange,提问作者Nayeem Rahman
相关产品推荐
相关产品推荐

