При вводе раскрывающегося значения в столбце, если это первое использование этого раскрывающегося значения, необходимо создать лист с именем раскрывающегося значения. Если это не первое использование, то никаких действий (кроме заполнения раскрывающегося списка) не существует.
Для этого требуется сочетание следующих факторов: обнаружение раскрывающегося списка, обеспечение его на нужном листе, столбце истрока, определяющая, использовалось ли значение ранее и, если нет, для создания нового листа. Вероятно, есть много способов сделать это;рассмотрим следующий только один пример.
В этом примере соответствующий лист для просмотра - «Лист1», а соответствующий столбец - «Столбец А». Существует одна строка заголовка, и в строках ниже строки заголовка есть выпадающие ячейки.
Логический поток:
- использует простой триггер onEdit (e) для обнаружения ввода данных.
- использование объектов событий для определения отредактированного столбца, строки, имени листа и значения.
- использование других переменных для управления количествомстроки заголовка и соответствующий столбец для просмотра.
- создайте оператор
IF
, чтобы подтвердить, что редактирование было в соответствующем листе, столбце и строке, затем - получите диапазон и значения вСтолбец A - включите строку 1, чтобы
setValues()
всегда применял - , чтобы сгладить результирующий 2D-массив с 1D, используя Javascript
map
, метод - , найдите первый иПоследнее появление раскрывающегося значения в диапазоне с использованием Javascript indexOf и lastIndexOf
- , если первое и последнее значения совпадают, то это должно быть первое и единственноеиспользовать раскрывающееся значение, поэтому создайте новый лист insertSheet (sheetName) , где "sheetname" - это значение раскрывающегося списка.
function onEdit(e){
//so5842003001
var ss = SpreadsheetApp.getActiveSpreadsheet()
var sheetname = "Sheet1";
var sheet = ss.getSheetByName(sheetname);
//Logger.log(JSON.stringify(e));//DEBUG
var eColumn = e.range.getColumn();
var eRow = e.range.getRow();
var eSheet = e.source.getSheetName();
var eValue = e.value;
var headerrow = 1; // number of header rows
var column = 1; // the data validation is in Column A
//Logger.log("DEBUG: column = "+eColumn+", sheet = "+eSheet+", Row = "+eRow+", header = "+headerrow);
if (sheetname === eSheet && eColumn === column && eRow > headerrow){
// column. row, and sheet are OK
// Logger.log("DEBUG: running the if");
//get the last row
var rows = sheet.getLastRow();
// Logger.log("DEBUG: last row = "+rows);
//define the range
var columnRange = sheet.getRange(1, column, rows);
// Logger.log("DEBUG: range = "+columnRange.getA1Notation());
// get the values
var columnvalue = columnRange.getValues();
// Logger.log(columnvalue); // DEBUG
// flatten the 2D array to 1D
var column1D= columnvalue.map(function(d){return d[0];});//[[d],[d],[d]]=>[d,d,d]
// Logger.log(column1D);// DEBUG
// get the first time this value appears in the range
var result = column1D.indexOf(eValue);
// get the last time this value appears in the range
var lastresult = column1D.lastIndexOf(eValue);
// Logger.log("DEBUG: result = "+result+", lastresult = "+lastresult)
// if the first time equals the last time, then this must be the first time it has appeared
// so insert the sheet
if (result === lastresult){
//Logger.log("first use of this value"); // DEBUG
// insert the sheet named for the cell
ss.insertSheet(eValue);
}
}
else {
// Logger.log("DEBUG: running the else");
}
}
Снимок экрана макета ответа