You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 10:07:13