Как исправить {"result": "error", "error": {"name": "Exception"}} в скриптах приложений Google - PullRequest
1 голос
/ 01 марта 2020

.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

В шаблоне сделайте c У меня есть: Имя1, Имя2, Имя3, Имя4 должны быть обновлены, как в заголовке листа

Так что, когда новая строка отправляется на лист, например, с Томом, Майком, Джоном, Энди - я получаю это в PDF-файле Том, Имя2, Имя3, Имя4 (обновляется только первое значение)

  • Перенаправлено на {"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>

Любая помощь приветствуется. Заранее спасибо

1 Ответ

0 голосов
/ 02 марта 2020

Как насчет этой модификации? Пожалуйста, подумайте об этом как об одном из нескольких возможных ответов.

Точки модификации:

  • В вашем скрипте createFile и setTrashed выполняются в течение для l oop for (var columnIndex = 0; columnIndex < headers.length; columnIndex++){}. В этом случае на 1-м l oop создается файл PDF, и copyFile перемещается в поле tra sh. Я думаю, что причина вашей проблемы может быть в следующем.

Чтобы избежать вышеуказанной ситуации, как насчет следующей модификации?

Модифицированный скрипт:

Когда Ваш скрипт изменен, пожалуйста, измените его следующим образом.

С:
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);
}

Примечание:

  • Когда вы изменили скрипт веб-приложений, пожалуйста, повторно разверните веб-приложения как новую версию. Таким образом, последний скрипт отражается в веб-приложениях. Пожалуйста, будьте осторожны с этим.

Если я неправильно понял ваш вопрос, и это был не тот результат, который вы хотите, я прошу прощения. В то время, чтобы правильно понять вашу ситуацию, можете ли вы предоставить образец электронной таблицы, включая ваш скрипт? Этим я хотел бы подтвердить это. Конечно, удалите вашу личную информацию.

...