Google Apps Script自动化创建诊疗记录故障排查请求
故障排查:Google Apps Script无法生成患者病历电子表格
我有一段Google Apps Script代码,想要实现以下自动化功能:
- 打开指定ID的电子表格,切换至“Base de Datos de Px”工作表;
- 检查指定ID的“Expedientes Px”文件夹中,是否存在与工作表内每一行患者姓名同名的子文件夹;
- 若该子文件夹不存在,则创建子文件夹,并从指定模板复制电子表格,命名为“Historial de Tratamiento”+患者姓名;
- 将原工作表中对应患者的ID、姓名、性别、年龄数据写入新电子表格的“Tratamientos”工作表指定单元格。
但当前代码无法生成任何电子表格,我已经排查过以下问题:
- 文件夹名称与工作表中“Nombre Px”字段的空格、标点是否存在不匹配;
- 文件共享权限(已设置为任何人通过链接可编辑);
均未解决问题,附上代码寻求帮助:
function getColumnIndexByName(columnName, headerRow) { for (var i = 0; i < headerRow.length; i++) { if (headerRow[i] === columnName) { return i; } } return -1; // Column name not found } function getFolderByName(parentFolder, folderName) { // Implement your logic to get the folder by name here // Return the folder if found, or null if not found // Example implementation: var folders = parentFolder.getFolders(); while (folders.hasNext()) { var folder = folders.next(); if (folder.getName().trim() === folderName.trim()) { // Trim and compare folder names return folder; } } return null; } function createTreatmentHistory() { var spreadsheet = SpreadsheetApp.openById('URL'); var sheet = spreadsheet.getSheetByName('Base de Datos de Px'); var data = sheet.getDataRange().getValues(); var folderId = 'URL'; var destinationFolder = DriveApp.getFolderById(folderId); var templateSpreadsheetId = 'URL'; for (var i = 1; i < data.length; i++) { var nombrePx = data[i][getColumnIndexByName('Nombre Px', data[0])]; if (nombrePx) { var folder = getFolderByName(destinationFolder, nombrePx); if (!folder) { var formattedFolderName = nombrePx.replace(/\s+/g, ''); // Remove spaces from the folder name folder = destinationFolder.createFolder(formattedFolderName); var newSpreadsheet = DriveApp.getFileById(templateSpreadsheetId).makeCopy('Historial de Tratamiento' + nombrePx, folder); var newSpreadsheetId = newSpreadsheet.getId(); var newSpreadsheet = SpreadsheetApp.openById(newSpreadsheetId); var tratamientosSheet = newSpreadsheet.getSheetByName('Tratamientos'); tratamientosSheet.getRange('C1').setValue(data[i][getColumnIndexByName('ID Px', data[0])]); tratamientosSheet.getRange('C2').setValue(nombrePx); tratamientosSheet.getRange('E2').setValue(data[i][getColumnIndexByName('Sexo', data[0])]); tratamientosSheet.getRange('G2').setValue(data[i][getColumnIndexByName('Edad', data[0])]); newSpreadsheet.saveAndClose(); // Move the spreadsheet to the created folder folder.createFile(newSpreadsheet); DriveApp.getFileById(newSpreadsheetId).setTrashed(true); } } } }
核心问题及修复方案
1. 致命错误:错误操作导致新表格被删除
代码中已经通过makeCopy直接把新表格复制到目标文件夹,但后续错误执行了folder.createFile(newSpreadsheet)和setTrashed(true):
folder.createFile(newSpreadsheet)无效,因为newSpreadsheet是Spreadsheet对象,不是Blob格式,会触发错误;- 紧接着的
setTrashed(true)会把刚创建的表格扔进回收站,导致你看不到任何生成的文件。
修复:删除这两行无效且致命的代码
2. 文件夹匹配逻辑不一致
创建文件夹时用了去掉空格的formattedFolderName,但检查文件夹是否存在时用的是原始nombrePx,会导致后续重复创建相同患者的文件夹。
修复:统一判断逻辑,检查文件夹时也使用格式化后的名称
3. 变量重复声明优化
原代码重复声明newSpreadsheet变量,分别赋值File对象和Spreadsheet对象,容易引发逻辑混淆,建议重命名区分。
4. 列索引预获取提升效率
原代码在循环内多次调用getColumnIndexByName,可以提前在循环外获取所有需要的列索引,减少重复计算,避免潜在错误。
修复后的完整代码
function getColumnIndexByName(columnName, headerRow) { for (var i = 0; i < headerRow.length; i++) { if (headerRow[i] === columnName) { return i; } } return -1; // Column name not found } function getFolderByName(parentFolder, folderName) { var folders = parentFolder.getFolders(); while (folders.hasNext()) { var folder = folders.next(); if (folder.getName().trim() === folderName.trim()) { return folder; } } return null; } function createTreatmentHistory() { // 替换为实际的电子表格ID var spreadsheet = SpreadsheetApp.openById('YOUR_SPREADSHEET_ID'); var sheet = spreadsheet.getSheetByName('Base de Datos de Px'); var data = sheet.getDataRange().getValues(); var headerRow = data[0]; // 预获取所有需要的列索引,避免循环内重复计算 var idPxCol = getColumnIndexByName('ID Px', headerRow); var nombrePxCol = getColumnIndexByName('Nombre Px', headerRow); var sexoCol = getColumnIndexByName('Sexo', headerRow); var edadCol = getColumnIndexByName('Edad', headerRow); // 替换为实际的目标文件夹ID var folderId = 'YOUR_FOLDER_ID'; var destinationFolder = DriveApp.getFolderById(folderId); // 替换为实际的模板电子表格ID var templateSpreadsheetId = 'YOUR_TEMPLATE_ID'; for (var i = 1; i < data.length; i++) { var nombrePx = data[i][nombrePxCol]; if (nombrePx) { // 使用格式化后的名称检查文件夹,和创建时保持一致 var formattedFolderName = nombrePx.replace(/\s+/g, ''); var folder = getFolderByName(destinationFolder, formattedFolderName); if (!folder) { // 创建格式化后的文件夹 folder = destinationFolder.createFolder(formattedFolderName); // 直接复制模板到目标文件夹 var newSpreadsheetFile = DriveApp.getFileById(templateSpreadsheetId) .makeCopy('Historial de Tratamiento ' + nombrePx, folder); var newSpreadsheet = SpreadsheetApp.openById(newSpreadsheetFile.getId()); var tratamientosSheet = newSpreadsheet.getSheetByName('Tratamientos'); // 使用预获取的列索引赋值 tratamientosSheet.getRange('C1').setValue(data[i][idPxCol]); tratamientosSheet.getRange('C2').setValue(nombrePx); tratamientosSheet.getRange('E2').setValue(data[i][sexoCol]); tratamientosSheet.getRange('G2').setValue(data[i][edadCol]); newSpreadsheet.saveAndClose(); } } } }
额外注意事项
- 请将代码中的
YOUR_SPREADSHEET_ID、YOUR_FOLDER_ID、YOUR_TEMPLATE_ID替换为实际ID值; - 运行代码前,确保当前账号对目标文件夹、模板表格有编辑权限;
- 可添加
console.log()打印关键变量(如nombrePx、folder状态),方便调试。
内容的提问来源于stack exchange,提问作者Chris Rocha
相关产品推荐
相关产品推荐

