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

Google Sheets生成报告文档脚本故障排查求助

问题:Google Apps Script无法生成报告文档排查与修复

我需要开发一个基于Google Sheets生成报告文档的Google Apps Script脚本,但尝试多种方法后均无法成功创建目标文档。已添加文档创建失败弹窗提示但未触发,设置创建成功UI弹窗也无响应。脚本规则:当A列值为true时,按“报告+创建日期”格式生成文档;B列含嵌套信息,C列指定所属工作组。

原代码

function criarRelatoriosCentro() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var unidades = {};
  var data = new Date();
  var meses = ["janeiro", "fevereiro", "março", "abril", "maio", "junho", "julho", "agosto", "setembro", "outubro", "novembro", "dezembro"];
  var hoje = data.getDate() + '-' + meses[data.getMonth()] + '-' + data.getFullYear();
  
  // Obtém os dados da planilha
  var range = ss.getSheetByName("Centro").getDataRange();
  var valores = range.getValues();
  
  // Preenche o objeto 'unidades' com os dados da planilha
  for (var i = 1; i < valores.length; i++) {
    var ativo = valores[i][0];
    var unidade = valores[i][1];
    var equipe = valores[i][2];
    var dados = valores[i].slice(4, 70); // Dados da coluna E até BO
    
    if (ativo === true && unidade && equipe) { // Verifica se a unidade está marcada como TRUE
      if (!unidades[unidade]) {
        unidades[unidade] = {
          nome: unidade,
          equipes: [],
          dados: {},
          rowIndex: i + 1 // 保存当前行号,用于后续写入文档ID
        };
      }
      
      unidades[unidade].equipes.push(equipe);
      
      // Cria um objeto para cada coluna entre E e BO
      for (var j = 0; j < dados.length; j++) {
        var coluna = String.fromCharCode(69 + j); // 69 é o código ASCII para 'E'
        unidades[unidade].dados[coluna] = dados[j];
      }
    }
  }
  
  // Cria os relatórios para cada unidade
  for (var unidade in unidades) {
    var nomeDocumento = "Relatório CS " + unidades[unidade].nome + " " + hoje;
    var doc;
    try {
      doc = DocumentApp.create(nomeDocumento);
    } catch (e) {
      SpreadsheetApp.getUi().alert("Falha ao criar o documento: " + nomeDocumento + "\nErro: " + e.message);
      continue;
    }

    var body = doc.getBody();

    // 仅保留切片范围内的列引用
    var colunaE = unidades[unidade].dados['E'];
    var colunaF = unidades[unidade].dados['F'];
    var colunaG = unidades[unidade].dados['G'];
    var colunaH = unidades[unidade].dados['H'];
    var colunaI = unidades[unidade].dados['I'];
    var colunaJ = unidades[unidade].dados['J'];
    var colunaK = unidades[unidade].dados['K'];
    var colunaL = unidades[unidade].dados['L'];
    var colunaM = unidades[unidade].dados['M'];
    var colunaN = unidades[unidade].dados['N'];
    var colunaO = unidades[unidade].dados['O'];
    var colunaP = unidades[unidade].dados['P'];
    var colunaQ = unidades[unidade].dados['Q'];
    var colunaR = unidades[unidade].dados['R'];
    var colunaS = unidades[unidade].dados['S'];
    var colunaT = unidades[unidade].dados['T'];
    var colunaU = unidades[unidade].dados['U'];
    var colunaV = unidades[unidade].dados['V'];
    var colunaW = unidades[unidade].dados['W'];
    var colunaX = unidades[unidade].dados['X'];
    var colunaY = unidades[unidade].dados['Y'];
    var colunaZ = unidades[unidade].dados['Z'];
    var colunaAA = unidades[unidade].dados['AA'];
    var colunaAB = unidades[unidade].dados['AB'];
    var colunaAC = unidades[unidade].dados['AC'];
    var colunaAD = unidades[unidade].dados['AD'];
    var colunaAE = unidades[unidade].dados['AE'];
    var colunaAF = unidades[unidade].dados['AF'];
    var colunaAG = unidades[unidade].dados['AG'];
    var colunaAH = unidades[unidade].dados['AH'];
    var colunaAI = unidades[unidade].dados['AI'];
    var colunaAJ = unidades[unidade].dados['AJ'];
    var colunaAK = unidades[unidade].dados['AK'];
    var colunaAL = unidades[unidade].dados['AL'];
    var colunaAM = unidades[unidade].dados['AM'];
    var colunaAN = unidades[unidade].dados['AN'];
    var colunaAO = unidades[unidade].dados['AO'];
    var colunaAP = unidades[unidade].dados['AP'];
    var colunaAQ = unidades[unidade].dados['AQ'];
    var colunaAR = unidades[unidade].dados['AR'];
    var colunaAS = unidades[unidade].dados['AS'];
    var colunaAT = unidades[unidade].dados['AT'];
    var colunaAU = unidades[unidade].dados['AU'];
    var colunaAV = unidades[unidade].dados['AV'];
    var colunaAW = unidades[unidade].dados['AW'];
    var colunaAX = unidades[unidade].dados['AX'];
    var colunaAY = unidades[unidade].dados['AY'];
    var colunaAZ = unidades[unidade].dados['AZ'];
    var colunaBA = unidades[unidade].dados['BA'];
    var colunaBB = unidades[unidade].dados['BB'];
    var colunaBC = unidades[unidade].dados['BC'];
    var colunaBD = unidades[unidade].dados['BD'];
    var colunaBE = unidades[unidade].dados['BE'];
    var colunaBF = unidades[unidade].dados['BF'];
    var colunaBG = unidades[unidade].dados['BG'];
    var colunaBH = unidades[unidade].dados['BH'];
    var colunaBI = unidades[unidade].dados['BI'];
    var colunaBJ = unidades[unidade].dados['BJ'];
    var colunaBK = unidades[unidade].dados['BK'];
    var colunaBL = unidades[unidade].dados['BL'];
    var colunaBM = unidades[unidade].dados['BM'];
    var colunaBN = unidades[unidade].dados['BN'];
    var colunaBO = unidades[unidade].dados['BO'];
    
    var textoPredeterminado = "Este é o texto pré-determinado que será inserido em cada relatório. Aqui estão os dados específicos: " + colunaE + ", " + colunaF + ", " + colunaG + ", " + colunaH + ", ..., " + colunaBO;
    
    body.appendParagraph("Relatório para a unidade: " + unidades[unidade].nome);
    body.appendParagraph("Equipes ativas:");
    body.appendParagraph(unidades[unidade].equipes.join(", "));
    body.appendParagraph("Dados:");
    
    // 正确遍历对象数据并显示
    var dadosTexto = [];
    for (var col in unidades[unidade].dados) {
      dadosTexto.push(col + ": " + unidades[unidade].dados[col]);
    }
    body.appendParagraph(dadosTexto.join(", "));
    body.appendParagraph(textoPredeterminado);
    
    // Salva o ID do documento na linha correta
    ss.getSheetByName("Centro").getRange("BM" + unidades[unidade].rowIndex).setValue(doc.getId());

    // Exibe um alerta com o ID do documento
    var docId = doc.getId();
    SpreadsheetApp.getUi().alert("Relatório criado com sucesso! O ID do documento é: " + docId);

    // Move o documento para uma pasta específica
    var pastaId = '1MK8KRyFJoYiuD7Ue4GYupJGT7jB06a3K'; // 使用纯文件夹ID
    try {
      var arquivo = DriveApp.getFileById(doc.getId());
      DriveApp.getFolderById(pastaId).addFile(arquivo);
      DriveApp.getRootFolder().removeFile(arquivo);
    } catch (e) {
      SpreadsheetApp.getUi().alert("Falha ao mover documento para pasta: " + e.message);
    }
  }
}

function onOpen() {
  var menu = SpreadsheetApp.getUi().createMenu('Relatórios');
  menu.addItem('Criar Relatório Centro','criarRelatoriosCentro')
      .addItem('Criar Relatório Continente','criarRelatoriosContinente')
      .addItem('Criar Relatório Norte','criarRelatoriosNorte')
      .addItem('Criar Relatório Sul','criarRelatoriosSul')
      .addToUi();
}

核心问题与修复说明

  • 文档创建异常处理:DocumentApp.create()失败时会直接抛出异常,原代码的if (!doc)判断无效,改为try-catch捕获错误并弹窗提示。
  • 行索引保存:在收集数据时保存当前行号,确保文档ID写入对应行的BM列,而非最后一行。
  • Drive文件夹ID修正:将完整URL替换为纯文件夹ID,DriveApp.getFolderById()仅接受ID参数。
  • 对象数据显示优化:遍历dados对象,将键值对转为字符串,避免[object Object]的无效显示。
  • 移除超出范围的列引用:删除了切片范围外的BP到BZ列引用,避免undefined值。
  • 菜单代码简化:合并addToUi()调用,避免重复执行。

内容的提问来源于stack exchange,提问作者Guilherme

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 09:15:56