Скрипт Google, запускаемый отправкой формы, иногда не работает

У меня есть скрипт, который читает ответы из формы Google при ее отправке. Сценарий привязан к электронной таблице, которая фиксирует все ответы. Сценарий создает PDF-файл с некоторой информацией и отправляет его пользователю через GmailApp и сохраняет PDF-файл в папке на Диске. Но иногда скрипт не работает. Ответы всегда сохраняются в таблице, но, несмотря на это, скрипт не запускается. Я проверил "Расшифровку исполнения", но там есть информация о последнем успешном исполнении.

Как я могу гарантировать, что скрипт всегда будет работать?

Кто-нибудь может объяснить, почему это происходит?

Код

//ID del template
var docTemplate = "Template ID Here";
//Nombre de la copia
var docName = "biovenCIP";

//FUnción principal para generación y envío de constancia
function onFormSubmit(e){
  //Leyendo datos del formulario
  var d = new Date();
  var registration_date = e.values[0];
  var first_name = e.values[1];
  var second_name = e.values[2];
  var first_lastname = e.values[3];
  var second_lastname = e.values[4];
  var document_type = e.values[5];
  var document_number = e.values[6];
  var email_address = e.values[7];
  var occupation = e.values[8];
  var category = e.values[9];
  var payment_number = e.values[10];
  var payment_date = e.values[11];

  //Inicializando mensaje opcional
  var occupation_message = " ";

  //Generando el nombre completo
  if(second_name.localeCompare("") != 0){
    second_name = " " + second_name;
  }
  if(second_lastname.localeCompare("") != 0){
    second_lastname = " " + second_lastname;
  }
  var full_name = first_name + second_name + " " + first_lastname + second_lastname;
  full_name = full_name.replace(/\s+/g," ");

  //Generando compia del template  
  var copyID = DocsList.getFileById(docTemplate).makeCopy(docName + '_' + document_number).getId();
  var copyDoc = DocumentApp.openById(copyID);
  var copyBody = copyDoc.getActiveSection();

  //Reemplazando texto en el template
  copyBody.replaceText('keyDate', registration_date);
  copyBody.replaceText('keyFullName', full_name);
  copyBody.replaceText('keyIDType', document_type);
  copyBody.replaceText('keyIDNumber', document_number);
  copyBody.replaceText('keyEmail', email_address);
  copyBody.replaceText('keyOccupation', occupation);
  switch(occupation){
      case "Estudiante de pregrado":
      occupation_message = "(presente carnet el primer día del evento)";
      var payment_worth = 100.00;
      break
      case "Estudiante de postgrado":
      occupation_message = "(presente carnet el primer día del evento)";
      var payment_worth = 150.00;
      break
      case "Profesional":
      var payment_worth = 200.00;
      break
  }
  copyBody.replaceText('keyOMessage', occupation_message);
  copyBody.replaceText('keyCategory', category);
  copyBody.replaceText('keyPaymentNum', payment_number);
  copyBody.replaceText('keyPaymentDate', payment_date);
  copyBody.replaceText('keyPayment', payment_worth)
  copyDoc.saveAndClose();

  //Convertir temporalmente a PDF
  var pdf = DocsList.getFileById(copyID).getAs("application/pdf");

  //Adjuntando PDF y enviado correo electrónico
  var reply_email = "[email protected]";
  var bcc_email = "[email protected]";
  var subject = "Constancia de inscripción - BIOVEN 2015";
  var body = "Estimado " + full_name + ",<br/><br/> A través de este correo electrónico le hacemos entrega de su constancia de inscripción en el V Congreso Venezolano de Bioingeniería - BIOVEN 2015, la cual deberá presentar el primer día del congreso durante la verificación de registro.<br/><br/> Agradecidos,<br/><br/> <b>Comité Organizador del BIOVEN 2015</b>";
  GmailApp.sendEmail(email_address, subject, body, {name: 'Congreso BIOVEN 2015', bcc: bcc_email, htmlBody: body, replyTo: reply_email, attachments: pdf});

  //Guardando PDF en Drive
  var folder_id = "Folder ID Here";
  DriveApp.getFolderById(folder_id).createFile(pdf);

  //Borrando archivo DOC temporal
  DocsList.getFileById(copyID).setTrashed(true);
}

person osjerick    schedule 10.02.2015    source источник
comment
Мое решение состояло бы в том, чтобы сделать веб-приложение и опубликовать его, гарантируя 100%, что каждая отправка будет работать.   -  person Kriggs    schedule 10.02.2015
comment
@Kriggs Итак, это нормальная проблема?   -  person osjerick    schedule 10.02.2015
comment
@Kriggs Как я могу это сделать?   -  person osjerick    schedule 10.02.2015
comment
в редакторе скриптов › ресурсы›триггеры вы можете установить уведомление на немедленную отправку (или что-то в этом роде ;-), это отправит вам уведомление об ошибке вместе с некоторой информацией о том, что произошло. Или вы можете обернуть свой код в try/catch, который отправит вам сообщение, если попытка не удалась. Скрипт, вероятно, запускается, но просто не работает. Публикация в виде веб-приложения ничего не изменит.   -  person Serge insas    schedule 11.02.2015
comment
@Sergeinsas Я уже установил уведомления, скрипт работает хорошо, но иногда он просто не работает, поэтому он не генерирует ни транскрипцию выполнения, ни уведомления. :(   -  person osjerick    schedule 11.02.2015
comment
Я изменил место скрипта, теперь он привязан к форме, возможно это поможет избежать проблемы.   -  person osjerick    schedule 11.02.2015
comment
возможно, вы могли бы добавить безусловную отправку почты, чтобы проверить, работает она или нет   -  person Serge insas    schedule 11.02.2015


Ответы (1)


Попробуйте определить свою переменную payment_worth выше в коде:

function onFormSubmit(e){
  //Leyendo datos del formulario
  var d = new Date();
  //Other var definitions
  var payment_worth = 0;

Присвойте ему начальное значение, равное нулю. В настоящее время, если ваш Case/Select когда-либо терпит неудачу, переменная payment_worth будет неопределенной.

Ошибка ссылки

Просто идея. Не знаю, хорошая ли это идея. ;)

Выбор случая будет выглядеть так:

switch(occupation){
  case "Estudiante de pregrado":
  occupation_message = "(presente carnet el primer día del evento)";
  payment_worth = 100.00;
  break
  case "Estudiante de postgrado":
  occupation_message = "(presente carnet el primer día del evento)";
  payment_worth = 150.00;
  break
  case "Profesional":
  payment_worth = 200.00;
  break
}
person Alan Wells    schedule 11.02.2015