FormApp.getActiveForm () возвращает неверный идентификатор формы при вызове из триггера формы, который содержит этот вызов функции - PullRequest
0 голосов
/ 09 февраля 2019

Я пытаюсь автоматизировать рабочие процедуры с помощью форм Google, php и mysql.Я сделал следующую архитектуру программного обеспечения.

Существует форма с именем S, она статическая, так как я создал ее вручную с помощью графического интерфейса.Форма Sform имеет триггер отправки формы, который помещает данные в базу данных MySQL.

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

Этот скрипт получает параметры и анализирует их, получает новые обработанные данные из моей базы данных и программно создает формы в зависимости от выбранных данных, наконец, он добавляет триггер для динамически (программно) созданной формы или форм (назовем их)как Dform).

Проблема в том, что функция FormApp.getActiveForm (), которая закодирована в триггере программно созданной формы, возвращает идентификатор статической формы (которая создается вручную).

Здесь код статической формы Sform submit trigger:

function SaveData() {
  var form = FormApp.getActiveForm();
  var formResponses = form.getResponses();
  var formResponse = formResponses[formResponses.length-1];
  var email = formResponse.getRespondentEmail();
  var itemResponses = formResponse.getItemResponses();
  var workDay = null;
  var workFiles = null;
  for (var j = 0; j < itemResponses.length; j++) {
    var itemResponse = itemResponses[j];
    if (itemResponse.getItem().getTitle() == 'Pick the date of files you uploading') {
        workDay = itemResponse.getResponse().toString();
    }
    if (itemResponse.getItem().getTitle() == 'Choose log files to be uploaded') {
        workFilesIds = itemResponse.getResponse();
    }
  }

  var dbUrl = '...';
  var user = '...';
  var userPwd = '...';
  var conn = Jdbc.getConnection(dbUrl, user, userPwd);

  var stmt = conn.prepareStatement('select worker_id from in_workers where worker_name = ?');
  stmt.setString(1, email);
  var results = stmt.executeQuery();
  var worker_id = -1;
  while (results.next()) {
    worker_id = results.getString(1);
  }
  results.close();

  if (worker_id == -1) {
    stmt = conn.prepareStatement('INSERT INTO in_workers '
                                   + '(worker_name) values (?)', 1);
    stmt.setString(1, email);
    stmt.executeUpdate();
    var res = stmt.getGeneratedKeys();
    res.beforeFirst();
    res.next();
    worker_id = res.getInt(1);
  }

  var fName = '';
  var fBlob = new Array(workFilesIds.length);
  for (var j = 0; j < workFilesIds.length; j++) {
    var file = DriveApp.getFileById(workFilesIds[j]);
    fName = fName + '\n\r' + file.getName();
    fBlob[j] = file;

    stmt = conn.prepareStatement('INSERT INTO test_dep_files '
                                   + '(worker_id, file_name, file_date, file_body) values (?, ?, ?, ?)');

    stmt.setString(1, worker_id);
    stmt.setString(2, file.getName());
    stmt.setDate(3, Jdbc.parseDate(workDay));
    stmt.setBytes(4, file.getBlob().getBytes());

    stmt.executeUpdate();
  }

  conn.close();

  GmailApp.sendEmail('...', 'Control workplace form completed'
                     , 'User ' + email + ' uploaded data on ' + workDay 
                     + ' file list: ' + fName, 
                     {attachments: fBlob, name: fName});
}

Вот код скрипта, опубликованный в виде веб-приложения:

function doGet(e) {
  var worker_id = e.parameter['worker_id'];
  var form_trig_func_name = e.parameter['form_trig_func_name'];

  var dbUrl = '...';
  var user = '...';
  var userPwd = '...';
  var conn = Jdbc.getConnection(dbUrl, user, userPwd);

  stmt = conn.prepareStatement('select form_id from in_workers where worker_id = ?');
  stmt.setString(1, worker_id);
  var results = stmt.executeQuery();
  var form_id;
  results.beforeFirst();
  while (results.next()) {
    form_id = results.getString(1);
  }
  results.close();

  var form;
  try {
    form = FormApp.openById(form_id);
    var items = form.getItems();
    var l = items.length;
    for (var j = 0; j < l; j++) {
      form.deleteItem(0);
    }
  } catch (e) {
    form = FormApp.create('Enter additional products data');
  }

  stmt = conn.prepareStatement('select fc_id, fc_name_sys, fc_date from test_dep_fc t1' 
    + ', test_dep_files t2 where t1.file_id = t2.file_id and fc_name_real is null '
    + 'and worker_id = ?');
  stmt.setString(1, worker_id);
  var results = stmt.executeQuery();
  results.beforeFirst();
  while (results.next()) {
    form.addTextItem()
      .setTitle(results.getString(2) + ' от ' + results.getString(3))
      .setHelpText(results.getString(1));
  }
  results.close();

  form_id = form.getId();

  var allTriggers = ScriptApp.getUserTriggers(form);
  var l = allTriggers.length;
  for (var i = 0; i < l; i++) 
      ScriptApp.deleteTrigger(allTriggers[i]);
  allTriggers = ScriptApp.getProjectTriggers();
  l = allTriggers.length;
  for (var i = 0; i < l; i++) {
    if (allTriggers[i].getHandlerFunction() === 'saveData' + form_trig_func_name) {
      ScriptApp.deleteTrigger(allTriggers[i]);
    }
  }

  ScriptApp.newTrigger('saveData'+form_trig_func_name)
    .forForm(form)
    .onFormSubmit()
    .create();
  var form_url = form.getPublishedUrl();

  stmt = conn.prepareStatement('update in_workers set form_id = ?, form_url = ? where worker_id = ?');
  stmt.setString(1, form_id);
  stmt.setString(2, form_url);
  stmt.setString(3, worker_id);
  stmt.execute();
  conn.close();

  return HtmlService.createHtmlOutput(form_id + '\n\r' + form_trig_func_name);
}

Это код динамически (программно) созданных формDforms:

function saveData2() {
  var form = FormApp.getActiveForm();
  var formResponses = form.getResponses();
  var formResponse = formResponses[formResponses.length-1];
  var itemResponses = formResponse.getItemResponses();

  var dbUrl = '...';
  var user = '...';
  var userPwd = '...';
  var conn = Jdbc.getConnection(dbUrl, user, userPwd);

  var fc_names_real = '';
  var fc_ids = '';
  var fc_names_sys = '';

  for (var j = 0; j < itemResponses.length; j++) {
    var itemResponse = itemResponses[j];
    var fc_id = itemResponse.getItem().getHelpText();
    var fc_name_sys = itemResponse.getItem().getTitle();
    var fc_name_real = itemResponse.getResponse().toString();

    fc_names_real = fc_names_real + ' ' + fc_name_real;
    fc_ids = fc_ids + ' ' + fc_id;
    fc_names_sys = fc_names_sys + ' ' + fc_name_sys;

    stmt = conn.prepareStatement('update test_dep_fc '
                                   + 'set fc_name_real = ? where '
                                   + 'fc_id = ?');
    stmt.setString(1, fc_name_real);
    stmt.setString(2, fc_id);
    stmt.executeUpdate();
  }

  conn.close();

  GmailApp.sendEmail('...', 'Control workplace form2 completed'
                     , 'Product serial nums: ' + fc_names_real
                     + '\n\rProducts sys nums: ' + fc_names_sys 
                     + '\n\rProducts ids: ' + fc_ids
                     );
}

function saveData3() {
  the same code as for saveData2
  }
function saveData4() {
  the same code as for saveData2
  }
function saveData5() {
  the same code as for saveData2
  }
...

Итак, проблема в том, что в saveData2 первая инструкция кода возвращает неправильный идентификатор формы.Он всегда возвращает идентификатор формы Sform.

Пожалуйста, помогите мне с этим, я готов думать, что нашел ошибку в формах Google.

Большое спасибо, Ярослав

РЕДАКТИРОВАТЬ 1 привет @tehhowch, спасибо, я пробовал, но, к сожалению, следующий код

function saveData2(e) {
    //var form_id = e.source.getId();
    ...

также возвращает неверный идентификатор формы, он возвращает идентификатор формы.

1 Ответ

0 голосов
/ 20 июля 2019

Наконец, эта проблема была решена на следующий день, она была написана здесь.Решение простое и глупое.

  1. В сценарии, опубликованном в виде кода веб-приложения, я добавляю следующие инструкции после кода создания формы.Я сохраняю имя триггерной функции в ее свойствах.
  PropertiesService.getDocumentProperties().setProperty(
    'saveData'+form_trig_func_name, form_id);
Код для динамического (программного) создания форм Dforms был переписан.Когда срабатывает соответствующий триггер, я просто беру formId в ранее сохраненном значении свойства.
function saveData2(e) {
  //var form_id = e.source.getId();
  var form_id = PropertiesService.getDocumentProperties().getProperty('saveData2');
  saveDataAll (form_id, 2);
}
function saveData3() {
  var form_id = PropertiesService.getDocumentProperties().getProperty('saveData3');
  saveDataAll (form_id, 3);
}
function saveData4() {
  var form_id = PropertiesService.getDocumentProperties().getProperty('saveData4');
  saveDataAll (form_id, 4);
}
function saveData5() {
  var form_id = PropertiesService.getDocumentProperties().getProperty('saveData5');
  saveDataAll (form_id, 5);
}
function saveData6() {
  var form_id = PropertiesService.getDocumentProperties().getProperty('saveData6');
  saveDataAll (form_id, 6);
}
function saveData7() {
  var form_id = PropertiesService.getDocumentProperties().getProperty('saveData7');
  saveDataAll (form_id, 7);
}
function saveData8() {
  var form_id = PropertiesService.getDocumentProperties().getProperty('saveData8');
  saveDataAll (form_id, 8);
}
function saveData9() {
  var form_id = PropertiesService.getDocumentProperties().getProperty('saveData9');
  saveDataAll (form_id, 9);
}
function saveData10() {
  var form_id = PropertiesService.getDocumentProperties().getProperty('saveData10');
  saveDataAll (form_id, 10);
}
function saveData11() {
  var form_id = PropertiesService.getDocumentProperties().getProperty('saveData11');
  saveDataAll (form_id, 11);
}


function saveDataAll (form_id, saveData)
{
  var form = FormApp.openById(form_id);
  ...

У меня не более десяти пользователей этого функционала, и такой обходной путь работает для меня.Так что проблема закрыта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...