0

У меня есть таблицы Google под названием «Форма запроса продукта (Отзывы)» с 3-мя листы с надписью «Ответы на форме», «Клиффорд» и «Джим»Google Apps Script: Переместить строку на основе значения ячейки генерируемого представленной формой

в «Форма ответов» лист есть 3 колонки: «метка», «ProductArtist» & «ProductLabel»

Я хотел бы весь ряд, чтобы переместить/вырезать либо или лист «Джим» «Клиффорд» основанный на значении ячейки в разделе «ProductLabel»

Например Если значение ячейки «Warner», я бы хотел, чтобы строка переместилась в «Clifford», . Если значение ячейки «Universal», я бы хотел, чтобы эта строка переместилась в «Jim»

Это было бы также удобным для extermley чтобы они были перемещены, как только лист «Ответы на формы» заполняется кем-то, заполняющим форму.

function onEdit(event) { 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var s = event.source.getActiveSheet(); 
    var r = event.source.getActiveRange(); 

    if(s.getName() == "Form Responses" && r.getColumn() == 6 && r.getValue() == "Warner") { 
    var row = r.getRow(); 
    var numColumns = s.getLastColumn(); 
    var targetSheet = ss.getSheetByName("Clifford"); 
    var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1); 
    s.getRange(row, 1, 1, numColumns).moveTo(target); 
    s.deleteRow(row); 
    } 
} 

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

+0

Что вы уже пробовали? У вас есть код, который делает некоторые из того, что вы хотите? Потому что, как говорится, этот вопрос, похоже, является просьбой сделать домашнее задание для вас. – Mogsdad

+0

Прочтите ссылку об Installable Triggers. Из редактора сценариев вам нужно открыть «Ресурсы», «Триггеры текущего проекта», а затем добавить его. Вы укажете имя функции и характер триггера (представление формы). Триггеры onEdit не срабатывают при отправке формы, см. [этот ответ] (http://stackoverflow.com/questions/15232405/detect-user-inserting-row-or-column-in-a-google-spreadsheet-and -reacting-in-a-sc/15234631 # 15234631) для получения дополнительной информации. – Mogsdad

ответ

4

Если бы я писал этот код, вот замысел, который я последую за ним.

Также было бы удобно использовать их, как только лист «Ответы на формы» заполняется кем-то, заполняющим форму.

Вы можете написать функцию, которая будет автоматически активирована при отправке формы. Он получит событие, которое содержит информацию о представлении (значения формы & диапазон, в который они были вставлены в лист ответов).

Я хотел бы весь ряд, чтобы переместить/вырезать либо лист "Клиффорда" или "Jim" на основе значения ячейки в соответствии с "ProductLabel"

Поскольку значения предоставлены событием, отправленным по форме submit, очень легко скопировать информацию на другие листы. Следующая скелетная функция принимает решение на основе ProductLabel - и оно настроено так, чтобы легко развиваться, чтобы рассмотреть более двух значений для этого столбца. У него еще нет кода для копирования новых данных формы на целевой лист (, но он удалит вход перед выходом). Лично я хотел бы добавить столбец не-формы в исходный лист и использовать его для записи «состояния», как только я обработал новый ввод формы, но давайте придерживаться «move» или «copy-then-delete» », как было задано.

function handleNewForm(event) { 
    switch (event.namedValues.ProductLabel) { 
    case "Warner": 
     // write event.values to "Clifford" Sheet. 
     break; 
    case "Universal": 
     // write event.values to "Jim" Sheet. 
     break; 
    default: 
     // Unexpected input, needs to be handled 
     break; 
    } 
    // We have the range that contained the input, we can clear it. 
    // There are side-effects to this that you might not want. 
    event.range.clear(); 
} 

Копирование строки целевой лист

Для достижения этой цели, вам нужно выяснить, что диапазон назначения, а затем сделать что-то вроде:

destination.setValues([event.values]); 

Чтобы получить целевой диапазон , вам нужно открыть соответствующий лист, выяснить существующий диапазон данных (и, следовательно, следующую доступную строку), и использовать его для получения destination. Для .setValues() для работы destination должен иметь те же размеры, что и записываемый в него двумерный массив. Параметр event.values представляет собой одномерный массив - строку. Чтобы сделать это в двухмерном массиве, мы просто записываем его как одиночный элемент в новый массив, представляющий строки. Поэтому, чтобы написать [event.values] на целевой лист, нам нужен диапазон из 1 строки по 3 столбца.

Все, что осталось - это работа!

+0

* Все, что осталось - это работа! * (Я люблю это ;-) отличный ответ. + 1 –

0

Простота использования функции «запрос» в виде формулы ячейки, без необходимости в скрипте.

=query (base! A1:x; "select * where c='blah' ...") 

Используйте его на каждом листе.

1

Помните, что если вы используете функцию запроса для копирования данных, запрос извлекает только литерал-текст в ячейках-источниках. Например, если у вас есть = HYPERLINK() в ваших данных, использование запроса для копирования данных приведет к удалению ссылок, оставив только текст привязки. Чтобы скопировать эффективную формулу, вам необходимо использовать getFormulas()method.

Трудная вещь с этим методом заключается в том, что он дает строку [] [], полную пустых строк для всех ячеек, которые являются не формул. Если вы слепо применяете этот результат к цели с помощью setFormulas(), вы заполняете все содержимое без формулы, скопированное с использованием copyTo() или setValues().

Здесь discussion с кодом для объединения значений и массивов формул, которые затем можно применить с использованием метода setValues() в пределах одной и той же книги. Перемещение данных на лист в другой книге требует более низкоуровневой работы.