javascript - 如何修复 {"result":"error","error": {"name" :"Exception"}} in google apps scripts

标签 javascript google-apps-script google-sheets google-apps

.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()
  }
}

该代码的目的是:

  • 将数据发布到 Google 表格

  • 每次使用新行数据提交新行时创建一个新的 pdf 文件

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

  • 我应该有 4 个更新字段,但 pdf 中只更新了第一个字段

在模板文档中,我有:Name1、Name2、Name3、Name4,如工作表标题中所示进行更新

因此,当新行提交到工作表时,例如 Tom、Mike、John、Andy - 我在 pdf Tom、Name2、Name3、Name4 中得到这一点(仅更新第一个值)

  • 提交后重定向至 {"result":"error","error":{"name":"Exception"}}

.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重新部署为新版本。这样,最新的脚本就会反射(reflect)到 Web 应用程序中。请小心这一点。

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

关于javascript - 如何修复 {"result":"error","error": {"name" :"Exception"}} in google apps scripts,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60474659/

相关文章:

javascript - 我如何知道浏览器中是否已关闭 Javascript?

google-apps-script - 谷歌电子表格中的 getFormUrl() 仅返回最后一个链接表单的 url?

google-apps-script - 出现错误 "The script completed but did not return anything."

google-apps-script - 如何减少我的 Google Apps 脚本使用的 "computer time"?

javascript - Google 电子表格 : conditional, 包含从不同电子表格导入的行

javascript - 从 Google 电子表格读取和写入日期

javascript - 以编程方式检查单选按钮不适用于每个浏览器

javascript - 使用 WebCrypto 进行 AES 加密数据长度

javascript - 在 axios 中检测 xhr.status === 0

google-apps-script - 我可以使用一个Google脚本来处理多个电子表格吗?