如何修复 google 应用脚本中的 {"result":"error","error":{"name":"Exception"}}

How to fix {"result":"error","error":{"name":"Exception"}} in google apps scripts

.gs

var sheetName = 'Sheet1'
var scriptProp = PropertiesService.getScriptProperties()

function doPost (e){
  Logger.log(JSON.stringify(e))
  if (!e || !e.parameter){
    return;
  }

  var lock = LockService.getScriptLock();
  lock.tryLock(10 * 1000);

  try {
    var ss = SpreadsheetApp.getActive();
    var sheet1 = ss.getSheetByName(sheetName);
    var headers = sheet1.getRange(1, 1, 1, sheet1.getLastColumn()).getValues()[0];
    var nextRow = sheet1.getLastRow() + 1;
    var newRow = headers.map(function(header) {
      return header === 'Timestamp' ? new Date() : e.parameter[header]
    });
    sheet1.getRange(nextRow, 1, 1, newRow.length).setValues([newRow]);

    var TEMPLATE_ID = '....ID....'
    var PDF_FILE_NAME = newRow[3];
    var RESULTS_FOLDER_ID = '....ID....'
    var templateFile = DriveApp.getFileById(TEMPLATE_ID);
    var copyFile = templateFile.makeCopy();
    var copyId = copyFile.getId();
    var copyDoc = DocumentApp.openById(copyId);
    var copyBody = copyDoc.getActiveSection();
    var headerValue;
    var activeCell;
    var activeRow = sheet1.getRange(nextRow, 1, 1, newRow.length).getValues();

    for (var columnIndex = 0; columnIndex < headers.length; columnIndex++){
    headerValue = headers[columnIndex]
    activeCell = activeRow[0][columnIndex]
    copyBody.replaceText('<<' + headerValue + '>>', activeCell);
    copyDoc.saveAndClose();
    var newFile = DriveApp.createFile(copyFile.getAs('application/pdf'));
    copyFile.setTrashed(true);
    newFile.setName(PDF_FILE_NAME);
    if (RESULTS_FOLDER_ID !== ''){
        DriveApp.getFolderById(RESULTS_FOLDER_ID).addFile(newFile)
        DriveApp.removeFile(newFile)
    }
    }

    return ..
  }

  catch (e){
    return ContentService ..
  }

  finally{
    lock.releaseLock()
  }
}

代码的目的是:

我在 sheet 中成功接收到数据,并且在驱动器中创建了新的 pdf,但出现以下错误:

在模板文档中,我有:Name1、Name2、Name3、Name4 需要更新,如 sheet header

因此,当向 sheet 提交新行时,例如与 Tom、Mike、John、Andy - 我在 pdf Tom、Name2、Name3、Name4 (仅第一个值已更新)

.html

<!DOCTYPE html>
<html lang="en">
<body>
<head>
<base target="_top">
</head>
<form action="....URL...." target="_blank" method="POST">
<div>
Name1
<input type="text" required name="Name1">
</div>

<div>
Name2
<input type="text" required name="Name2">
</div>

<div>
Name3
<input type="text" required name="Name3">
</div>

<div>
Name4
<input type="text" required name="Name4">
</div>

<button type="submit">Post</button>

</form>
</body>
</html>

感谢任何帮助。提前致谢

这个修改怎么样?请将此视为几个可能的答案之一。

修改点:

  • 在您的脚本中,createFilesetTrashedfor (var columnIndex = 0; columnIndex < headers.length; columnIndex++){} 的 for 循环中是 运行。在这种情况下,在第一个循环中,将创建一个 PDF 文件,并将 copyFile 移至垃圾箱。我想你的问题可能是这个原因。

为了避免上述情况,下面的修改怎么样?

修改后的脚本:

当您的脚本修改时,请修改如下。

从:
for (var columnIndex = 0; columnIndex < headers.length; columnIndex++){
headerValue = headers[columnIndex]
activeCell = activeRow[0][columnIndex]
copyBody.replaceText('<<' + headerValue + '>>', activeCell);
copyDoc.saveAndClose();
var newFile = DriveApp.createFile(copyFile.getAs('application/pdf'));
copyFile.setTrashed(true);
newFile.setName(PDF_FILE_NAME);
if (RESULTS_FOLDER_ID !== ''){
    DriveApp.getFolderById(RESULTS_FOLDER_ID).addFile(newFile)
    DriveApp.removeFile(newFile)
}
}
到:
for (var columnIndex = 0; columnIndex < headers.length; columnIndex++){
  headerValue = headers[columnIndex]
  activeCell = activeRow[0][columnIndex]
  copyBody.replaceText('<<' + headerValue + '>>', activeCell);
}
copyDoc.saveAndClose();
var newFile = DriveApp.createFile(copyFile.getAs('application/pdf'));
copyFile.setTrashed(true);
newFile.setName(PDF_FILE_NAME);
if (RESULTS_FOLDER_ID !== ''){
  DriveApp.getFolderById(RESULTS_FOLDER_ID).addFile(newFile);
  DriveApp.removeFile(newFile);
}

注:

  • 当您修改了Web Apps的脚本后,请重新部署Web Apps为新版本。由此,最新的脚本被反​​映到Web Apps。请注意这一点。

如果我误解了您的问题而这不是您想要的结果,我深表歉意。届时,为了正确了解您的情况,您能否提供一份包含您的脚本的示例电子表格?借此,我想确认一下。当然,请删除您的个人信息。