REDCap嵌套重复仪器中复制DRUGS实例数据的方案咨询
解决REDCap嵌套重复仪器自动复制数据的问题
针对你在嵌套重复仪器(VISIT下嵌套DRUGS)场景中自动复制上一访视药物数据的需求,以下是三种可行解决方案:
方案1:项目钩子(Project Hooks)+ REDCap API(最可靠的自动方案)
Copy Data on Save模块对嵌套重复仪器的支持有限,用项目钩子配合API可以实现精准的自动复制逻辑。
实现步骤:
- 在项目的
hooks目录下创建hooks.php文件(如果没有hooks目录,联系管理员创建) - 插入以下代码(替换占位符为你的项目实际信息):
<?php function redcap_save_record($project_id, $record, $instrument, $event_id, $group_id, $survey_hash, $response_id, $repeat_instance) { // 仅处理VISIT仪器的新建实例(第一个实例无需复制) if ($instrument !== 'visit' || $repeat_instance == 1) return; // 获取上一个VISIT实例编号 $prev_visit_instance = $repeat_instance - 1; $api_url = APP_PATH_WEBROOT_FULL . 'api/'; $api_token = 'YOUR_PROJECT_API_TOKEN'; // 替换为你的项目API令牌 $target_drug_instrument = 'drugs'; // 替换为DRUGS仪器的内部名称 // 调用API导出上一VISIT下的所有DRUGS数据 $export_params = array( 'token' => $api_token, 'content' => 'record', 'action' => 'export', 'format' => 'json', 'records' => $record, 'events' => $event_id, 'instruments' => $target_drug_instrument, 'repeat_instance' => $prev_visit_instance, 'returnFormat' => 'json' ); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $api_url); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($export_params)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $drug_data = json_decode(curl_exec($ch), true); curl_close($ch); if (empty($drug_data)) return; // 修改DRUGS数据的关联VISIT实例编号为当前新建的实例 foreach ($drug_data as &$drug_entry) { $drug_entry['redcap_repeat_instance'] = $repeat_instance; $drug_entry['redcap_repeat_instrument'] = $target_drug_instrument; } // 调用API批量导入新的DRUGS实例 $import_params = array( 'token' => $api_token, 'content' => 'record', 'action' => 'import', 'format' => 'json', 'type' => 'flat', 'overwriteBehavior' => 'normal', 'forceAutoNumber' => false, 'data' => json_encode($drug_data), 'returnFormat' => 'json' ); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $api_url); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($import_params)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_exec($ch); curl_close($ch); } ?>
注意事项:
- 确保API令牌拥有项目的读写权限
- 替换
visit、drugs为仪器的内部名称(不是显示名称,可在仪器设置页查看) - 先在测试项目中验证逻辑,避免影响正式数据
方案2:自定义JavaScript + REDCap API(前端触发方案)
如果无法使用项目钩子,可以在前端通过JS监听VISIT保存事件,自动调用API复制数据。
实现步骤:
在项目的「自定义HTML/JS」设置中,添加以下代码:
// 监听VISIT仪器保存完成事件 $(document).on('submitComplete', function(event, data) { // 仅处理VISIT仪器的非第一个实例 if (data.instrument !== 'visit' || data.repeatInstance === 1) return; const recordId = $('input[name="record"]').val(); const eventId = $('input[name="event_id"]').val(); const currentInstance = data.repeatInstance; const prevInstance = currentInstance - 1; const apiToken = 'YOUR_PROJECT_API_TOKEN'; const apiUrl = REDCapAPI_URL; // 导出上一VISIT的DRUGS数据 $.ajax({ url: apiUrl, method: 'POST', data: { token: apiToken, content: 'record', action: 'export', format: 'json', records: recordId, events: eventId, instruments: 'drugs', repeat_instance: prevInstance, returnFormat: 'json' }, success: function(drugData) { if (drugData.length === 0) return; // 更新DRUGS数据的关联实例编号 drugData.forEach(drug => { drug.redcap_repeat_instance = currentInstance; }); // 导入新的DRUGS实例 $.ajax({ url: apiUrl, method: 'POST', data: { token: apiToken, content: 'record', action: 'import', format: 'json', type: 'flat', overwriteBehavior: 'normal', forceAutoNumber: false, data: JSON.stringify(drugData), returnFormat: 'json' }, success: function() { // 刷新页面显示新复制的DRUGS实例 location.reload(); } }); } }); });
注意事项:
- 依赖前端JS,若用户禁用JS则失效
- 同样需要替换API令牌和仪器内部名称
方案3:排查Copy Data on Save模块配置(快速尝试)
如果之前配置失败,可能是参数设置错误,重新检查:
- 确保模块为最新版本(旧版本不支持嵌套重复仪器)
- 配置页中:
- 源仪器选择
VISIT,源实例设置为「上一个实例」 - 目标仪器选择
DRUGS,目标实例设置为「新建实例」 - 勾选所有需要复制的DRUGS字段
- 源仪器选择
- 测试新建VISIT实例,若仍无法复制,说明模块确实不支持嵌套场景,改用前两种方案
内容的提问来源于stack exchange,提问作者STEFANO CALZA
相关产品推荐
相关产品推荐

