Как вставить пустые поля при вставке ответов из Google Sheet в форму
Я настроил скрипт для вставки существующих ответов в мою форму Google из листа Google (адаптируя код из этого ответа). Я вставил его в скрипты форм, и он работает, когда все поля в листе заполнены. Однако характер анкеты формы таков, что некоторые разделы могут быть пропущены, в результате чего некоторые поля на листе остаются пустыми. Я хотел бы вставить такой лист, в котором некоторые из его полей ответа пустые.
Сценарий работает, когда все поля в листе заполнены, но не когда он встречает пустое поле (это означает, что первая строка ответов, в которой есть пустое поле, останавливает выполнение сценария).
Я хотел бы знать, как объяснить моему сценарию, что он должен просто принимать пустые ответы и вставлять их как таковые?
Вот сценарий:
function ApendResponses() {
var form = FormApp.openById("1M-mTBlZPRj44jXs_YHj-cNa9yHjU25ItEWBuKtUvKZo");
var sheet = SpreadsheetApp.openByUrl("https://ocs.google.com/spreadsheets/d/1Jc9NVlN-Wcmd87E-FnyocHgl5Vx2WXqOGPTkhvXjCFU/");
var rows = sheet.getDataRange();
var numRows = rows.getNumRows();
var values = rows.getValues();
for (var x = 0; x < values.length; x++) {
var formResponse = form.createResponse();
var items = form.getItems();
var row = values[x];
var formItem = items[0.0].asTextItem();
var response = formItem.createResponse(row[1]);
formResponse.withItemResponse(response);
var formItem = items[1.0].asTextItem();
var response = formItem.createResponse(row[2]);
formResponse.withItemResponse(response);
var formItem = items[2.0].asListItem();
var response = formItem.createResponse(row[3]);
formResponse.withItemResponse(response);
var formItem = items[3.0].asPageBreakItem();
formResponse.withItemResponse(response);
var formItem = items[4.0].asListItem();
var response = formItem.createResponse(row[4]);
formResponse.withItemResponse(response);
var formItem = items[5.0].asPageBreakItem();
formResponse.withItemResponse(response);
var formItem = items[6.0].asListItem();
var response = formItem.createResponse(row[5]);
formResponse.withItemResponse(response);
var formItem = items[7.0].asPageBreakItem();
formResponse.withItemResponse(response);
var formItem = items[8.0].asTextItem();
var response = formItem.createResponse(row[6]);
formResponse.withItemResponse(response);
formResponse.submit();
Utilities.sleep(500);
}
};
Пример формы здесь, с прилагаемым листом здесь (я оставил пустое поле в третьем ряду для целей тестирования).
1 ответ
Вот решение, которое работает:
function ApendResponses() {
var form = FormApp.openById("1M-mTBlZPRj44jXs_YHj-cNa9yHjU25ItEWBuKtUvKZo");
var sheet = SpreadsheetApp.openByUrl("https://docs.google.com/spreadsheets/d/1Jc9NVlN-Wcmd87E-FnyocHgl5Vx2WXqOGPTkhvXjCFU/");
var rows = sheet.getDataRange();
var numRows = rows.getNumRows();
var values = rows.getValues();
for (var x = 0; x < values.length; x++) {
var formResponse = form.createResponse();
var items = form.getItems();
var row = values[x];
var formItem = items[0.0].asTextItem();
if (!isempty(row[1])){
var response = formItem.createResponse(row[1]);
formResponse.withItemResponse(response);}
var formItem = items[1.0].asTextItem();
if (!isempty(row[2])){
var response = formItem.createResponse(row[2]);
formResponse.withItemResponse(response);}
var formItem = items[2.0].asListItem();
if (!isempty(row[3])){
var response = formItem.createResponse(row[3]);
formResponse.withItemResponse(response);}
var formItem = items[3.0].asPageBreakItem();
formResponse.withItemResponse(response);
var formItem = items[4.0].asListItem();
if (!isempty(row[4])){
var response = formItem.createResponse(row[4]);
formResponse.withItemResponse(response);}
var formItem = items[5.0].asPageBreakItem();
formResponse.withItemResponse(response);
var formItem = items[6.0].asListItem();
if (!isempty(row[5])){
var response = formItem.createResponse(row[5]);
formResponse.withItemResponse(response);}
var formItem = items[7.0].asPageBreakItem();
formResponse.withItemResponse(response);
var formItem = items[8.0].asTextItem();
if (!isempty(row[6])){
var response = formItem.createResponse(row[6]);
formResponse.withItemResponse(response);}
formResponse.submit();
Utilities.sleep(0.01);
}
}
function isempty(entry) {
if (entry == undefined)
{
return true;
}
if (entry == null){
return true;
}
var tempstr = entry.toString();
tempstr = tempstr.replace(/[\r\n\t\s]+$/,"");
tempstr = tempstr.replace(/^[\r\n\t\s]+/,"");
if (tempstr.length == 0){
return true;
} else {
return false;
}
}
Это решение имеет две проблемы:
Он не останавливается, то есть после того, как скрипт обрабатывает последнюю строку, он продолжает добавлять пустые строки. С этим легко разобраться: сценарий должен быть остановлен после введения правильного количества ответов, а любые лишние ответы могут быть удалены по отдельности на вкладке "Ответы" форм.
На запуск скриптов уходит 6 минут. Таким образом, этот скрипт не может обрабатывать множество ответов (определенно, не более 500). Обходные пути можно сделать с помощью лучшего сценария (остановка, запись ответов, обработанных, затем повторный запуск оттуда до завершения работы) или разделение ответов на несколько листов и запуск их один за другим.