Когда данные формы добавляются в строку, автоматически создается раскрывающийся список в строке

Итак, у меня есть функция, которая будет получать отправку события формы и перемещать определенные поля на отдельный рабочий лист. Теперь мне нужно добавить раскрывающееся меню в первую строку, содержащую некоторые параметры IE. («НОВОЕ», «ЗАВЕРШИТЬ», «ОЖИДАЕТСЯ»). Есть ли способ добавления раскрывающегося списка в ячейку с помощью функции?

Вот мой рабочий код:

function AM2(e) {
  var form_name = "Form Responses 1";
  var open_name = "OPEN";

  var workbook = SpreadsheetApp.getActiveSpreadsheet();
  var form_ws = workbook.getSheetByName(form_name);
  var open_ws = workbook.getSheetByName(open_name);

  open_ws.appendRow(['',e.values[1],'',e.values[2]]);
}

На основании того, что я обнаружил, я подумал, что могу использовать SpreadsheetApp.newDataValidation().requireValueInList(['NEW', 'COMPLETE', 'PENDING'], true).

Я думал, что могу сделать что-то вроде этого:

function AM2(e) {
  var form_name = "Form Responses 1";
  var open_name = "OPEN";

  var workbook = SpreadsheetApp.getActiveSpreadsheet();
  var form_ws = workbook.getSheetByName(form_name);
  var open_ws = workbook.getSheetByName(open_name);

  open_ws.appendRow(open_ws.appendRow([SpreadsheetApp.newDataValidation().requireValueInList(['NEW', 'COMPLETE', 'PENDING'], true).build(),e.values[1],'',e.values[2]]);
}

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

Может есть способ захватить диапазон appendRow(). Если бы я мог получить это, я, вероятно, смог бы обойти эту ошибку.

Есть предположения?


person Mike - SMT    schedule 25.07.2019    source источник


Ответы (1)


Проблема:

Вы не сможете сделать это как часть appendRow(). Для этого вам нужно использовать setDataValidation(), который должен использоваться с объектом Range.


Решение:

Добавьте правило проверки данных сразу после добавления строки.

var row = open_ws.appendRow(['NEW',e.values[1],'',e.values[2]]).getActiveRange().getRow();

//set data validation
var rule = SpreadsheetApp.newDataValidation().requireValueInList(['NEW', 'COMPLETE', 'PENDING'], true).build();
open_ws.getRange(row, 1).setDataValidation(rule);

Как видите, я использовал ваш код для создания правила проверки в var rule, тогда все, что нам нужно сделать, это получить диапазон вашей недавно добавленной строки с помощью getActiveRange().getRow() в строке добавления, а затем установить проверку с помощью setDataValidation(rule).


Ссылка:

person ross    schedule 25.07.2019
comment
Я думал об использовании последней строки, однако возникает проблема, когда одновременно отправляются несколько заявок. иногда дублируется последняя строка. Возможно ли, чтобы строка обрабатывалась appendRow()? Это предотвратит проблемы с дублированием. - person Mike - SMT; 25.07.2019
comment
Насколько я знаю, внутри appendRow() это невозможно. Однако, если вы хотите, чтобы эта проверка применялась к каждой записи, почему бы просто не применить ее ко всему столбцу, а не делать это каждый раз при отправке формы? - person ross; 25.07.2019
comment
В конечном итоге я буду создавать некоторые функции, которые будут автоматически перемещать строку на завершенную вкладку при выборе выпадающего списка ЗАВЕРШЕНО. Поэтому я хотел иметь возможность обрабатывать все это в функции, которая запускается onFormSubmit. Тем не менее, я, вероятно, все еще смогу сделать это во всем ряду. Есть ли случайно поле, в котором можно установить значение по умолчанию NEW? - person Mike - SMT; 25.07.2019
comment
Вы уверены, что невозможно определить, какой диапазон appendRow() добавляется в данный момент? - person Mike - SMT; 25.07.2019
comment
@ Mike-SMT Что ж, сегодня я узнал кое-что новое! Просто попробовал использовать .appendRow().getActiveRange().getRow() с помощью триггера onFormSubmit, и он возвращает правильную строку для добавления. Я обновил код в своем ответе, вы хотите попробовать? PS: Также добавлено значение по умолчанию NEW для первого объекта в вашем массиве. - person ross; 25.07.2019
comment
Хорошо, это работает до тех пор, пока какая-то строка не будет удалена из рабочего листа назначения. Так, например, я отправил 2 формы, и все работало нормально. Я удалил 2 строки из рабочего листа назначения, и когда я отправил другую форму в данных, отправленных в правильную строку, раскрывающийся список перешел туда, где была бы следующая строка, если бы я не удалил другие. Я подозреваю, что getActiveRange() получает диапазон, в котором находятся данные на вкладке формы, которая получает полные данные. - person Mike - SMT; 25.07.2019
comment
Да, вы правы - getActiveRange() получает активный диапазон на вкладке формы, а не на этом листе. Помимо сравнения массивов или просто установки проверки для всего столбца, я не уверен, как вы сможете этого добиться. - person ross; 25.07.2019
comment
В настоящее время я смотрю на open_ws.getActiveRangeList(), чтобы увидеть, записывается ли где-нибудь другой диапазон. Пытаюсь заставить его возвращать реальный диапазон, а не имя объекта. - person Mike - SMT; 25.07.2019
comment
Возвращает два диапазона или только один? - person ross; 25.07.2019
comment
Мне не удалось показать, какие диапазоны были выбраны. Он всегда просто давал мне имя объекта диапазона. - person Mike - SMT; 25.07.2019
comment
Я только что пробовал - возвращает только 1 диапазон, такой же из .getActiveRange(). Думаю, для этого вам придется изменить свой подход. - person ross; 25.07.2019
comment
Какой метод вы использовали для получения информации о диапазоне? - person Mike - SMT; 25.07.2019
comment
Используйте getRanges() на своем rangeList объекте, он возвращает массив из Range объектов. - person ross; 25.07.2019