2013-07-19 8 views
0

Я относительно новичок в Google Apps Script и использовал очень простой скрипт, который я создал около года назад, который запускается, когда пользователь отправляет данные через форму Google. Сценарий работает отлично до примерно в мае прошлого года, и я пытался понять, что произошло, когда я не внес никаких изменений в свой код. Я искал много разных мест и не могу найти, что не так.Получение активной строки электронных таблиц

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

Вот мой код:

function acknowledgement() { 

var ActiveSheet = SpreadsheetApp.getActiveSheet(); 
var ActiveRow = ActiveSheet.getActiveRange().getRow(); 
var emailAddy = ActiveSheet.getRange("E"+ActiveRow).getValue(); 
var locvar = ActiveSheet.getRange("C"+ActiveRow).getValue(); 
var employeevar = ActiveSheet.getRange("B"+ActiveRow).getValue(); 

var sh = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Variables"); 
var contactvar = sh.getRange("A2").getValue(); 
var subject = sh.getRange("B2").getValue(); 
var contactvar2 = sh.getRange("C2").getValue(); 

var linebrk = "<br />"; 

var msg = "Dear " + employeevar + "," 
    + linebrk + linebrk 
    + "This confirms that you have completed your review of the latest security presentation." 
    + linebrk + linebrk 
    + "Your location number is " + locvar + "." 
    + "Thank you very much for your participation." 
    + linebrk + linebrk 
    + contactvar; 

var msghtml = '<p>'+msg+'</p>'; 

var advancedargs = {cc:contactvar2, htmlBody:msghtml}; 
MailApp.sendEmail(emailAddy, subject, msg, advancedargs); 

}; 

Что сейчас происходит не в том, что мой код больше не захватывая номера текущей строки (т.е. активной строки, который был только представлен пользователем). Вместо этого он просто захватывает верхнюю строку листа (т. Е. Заголовки строк, такие как «имя сотрудника», «адрес электронной почты» и т. Д.) И присваивая этим заголовкам строки переменным, что приводит к ошибке при попытке отправить подтверждение по электронной почте , Например, моя переменная emailAddy будет содержать «Адрес электронной почты», в результате чего сбой sendEmail.

Любая обратная связь будет оценена!

Martin

+0

Я полагаю, что вы установили триггер 'on Form Submit' на эту функцию подтверждения? Второй вопрос: есть ли что-нибудь в вашем листе ниже строки последнего ответа? –

+0

Привет, Serge, да, я установил триггер onFormSubmit. И нет ничего ниже последнего ответа. Строки были добавлены через форму Google без каких-либо проблем, но я просто не получал подтверждения по электронной почте, и пользователи не представили свои данные. Благодаря! – Martin

ответ

0

Использование getActiveRow в контексте формы представления несколько странно, как нельзя считать, что пользователь действительно активный на листе ... Я не знаю, почему вы сделали выбор такого подхода, и я «м на самом деле интересно, как это случилось работать так долго ...

есть и другие возможности для обработки формы представления, но тот, который потребуется наименьшее количество изменений в код, чтобы просто использовать getLastRow() вместо getActiveRange().getRow()

Существует несколько рисков для использования этой простой «стратегии» могут возникнуть проблемы с параллелизмом, когда два или более человек отправляют форму одновременно. Другое решение состоит в том, чтобы получить все значения полей непосредственно из свойств события, которые появляются при отправке формы, поскольку в этом случае каждое событие уникально, независимо от того, как оно входит в электронную таблицу, но ваш сценарий должен быть переписан более глубоко.

+0

Мое первоначальное мышление состояло в том, что когда пользователь отправляет форму и запускается сценарий, текущая запись заканчивается записью, которая была добавлена ​​в электронную таблицу через форму. Я не уверен, как он вообще прекратил работать. Я ценю помощь и попробую оба подхода.Я согласен с тем, что более простая проблема связана с параллелизмом. – Martin

0

Я считаю, что Google Forms хорошо освещает тот случай, о котором вы упоминаете, триггер «onFormSubmit» в электронной таблице, получает объект как параметр со всей необходимой информацией.

Я согласен с Сержем, что сценарий будет переписан глубоко, но, безусловно, это сэкономит много проблем.

Перейти к документации, в частности, в форме «Просмотр формы электронных таблиц» https://developers.google.com/apps-script/understanding_events.

Смежные вопросы