Как заполнять несколько листов каждый раз при отправке формы Google

Я создал очень простой скрипт приложений, который на основе ответов, предоставленных через форму Google, делает копию шаблона (лист в электронной таблице ответов формы) и заполняет ее введенной информацией. Это часть кода:

function fichas() {
var formato = SpreadsheetApp.getActiveSpreadsheet();
var ficha = formato.duplicateActiveSheet();
var respuestas = SpreadsheetApp.openById('ID').getSheetByName('Form Responses');

var name = respuestas.getRange(**2**, 5);
var apellido = ficha.getRange(4, 2);
name.copyTo(apellido);

var name2 = respuestas.getRange(**2**, 6);
var apellido2 = ficha.getRange(4, 3);
name2.copyTo(apellido2);

Жирным шрифтом выделена информация о первом пользователе. Я установил триггер, который запускает скрипт при отправке формы. Теперь я не знаю, как перейти к следующей строке, чтобы использовать информацию о следующем пользователе (другими словами, я хочу автоматически увеличивать это полужирное число на единицу при каждом запуске скрипта). Является ли это возможным? Я новичок в этом, и я пытаюсь научиться, но иногда это слишком сложно!

Я очень ценю вашу помощь!

Хорхе


person user2578210    schedule 16.07.2013    source источник


Ответы (1)


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

Сначала инициализируйте его с помощью такого оператора:

ScriptProperties.setProperty('rowValue', 1);// this must happen only once, you could insert it in a small function to "initialize"

а затем в своем коде вы можете получить его, используя

var rowValue = Number(ScriptProperties.getProperty('rowValue'));

увеличить его с помощью rowValue++ и записать обратно в хранилище ... помните, что вы всегда можете изменить это значение непосредственно в свойствах скрипта (редактор скрипта> файл> свойства проекта> свойства проекта)

ScriptProperties.setProperty('rowValue', rowValue);

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

Существует еще одна служба, предназначенная для решения этой ситуации: служба блокировки

документ дает явный пример того, как это реализовать: это выглядит просто так:

 var lock = LockService.getPublicLock();
 try {
   lock.waitLock(10000);
 } catch (e) {
   Logger.log('Could not obtain lock after 10 seconds.');
 }

сделайте то, что вам нужно, увеличьте счетчик ... и когда вы закончите, используйте

lock.releaseLock();

это может показаться сложным, но это не так ;-) и он будет работать безупречно во всех возможных ситуациях ... просто попробуйте.

person Serge insas    schedule 16.07.2013
comment
Спасибо большое за вашу помощь! Как я уже упоминал ранее, я учусь этому, и у меня нет никакого опыта в программировании ... Честно говоря, я пытался сделать то, что вы предлагали, но мне не совсем понятно, как это сделать, поэтому, очевидно, я не мог сделать это работает. Не могли бы вы мне помочь? Я очень ценю ваше время и усилия! - person user2578210; 18.07.2013
comment
Что вы имеете в виду, говоря «записать обратно в хранилище»? Я могу заставить скрипт заполнить мой шаблон, но я не могу увеличить rowValue для последующих шаблонов. - person user2578210; 19.07.2013