У меня есть запрос, собирающий имена из основного списка и помещающий их на лист. Поскольку он добавляет и убирает имена из этого листа, я хотел добавить и убрать выпадающие списки подтверждения данных, которые соответствуют именам.
Так что мне пришла в голову идея найти последнюю строку столбца A и последнюю строку столбца C, потому что C - это то, где выпадающий список, а A - их имя. И, получив разницу этих двух столбцов, можно определить не только местоположение, но и величину того, сколько клеток нужно изменить.
Несколько вещей, которые я обнаружил, заключались в том, что списки проверки данных не предоставляются с первым элементом, который является как хорошим, так и плохим. Поэтому мне пришлось создать функцию setValue, которая задает имя для «PLACE», в котором идут раскрывающиеся списки, потому что без него последний ряд столбца C будет считаться меньшим, поскольку раскрывающиеся списки проверки данных считаются как «».
Именно поэтому мне нужна разница в двух столбцах, чтобы я мог добавить «МЕСТО» к ячейкам, без полей проверки, заменяя каждую отдельную ячейку в столбце С словом «МЕСТО», поскольку это происходит каждый раз, когда лист был отредактирован. Я нашел несколько способов найти последние строки отдельных столбцов, которые я рассчитывал, только columnA-ColumnC или около того. Даже сделал их в абсолюте. Но есть один номер, который мне не позволили получить для диапазона, иначе он разрушает всю систему. 0.
function setValue(cellName, value) {
SpreadsheetApp.getActiveSpreadsheet().getRange(cellName).setValue(value);
}
function onChange(e){
var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var FirstEmptyA = getFirstEmptyRow('A:A');
Logger.log(FirstEmptyA);
var FirstEmptyC = getFirstEmptyRow('C:C');
Logger.log(FirstEmptyC);
var dif = Math.abs(FirstEmptyA - FirstEmptyC);
Logger.log(dif);
var rangeA = ss.getRange(2,3,FirstEmptyA -1)
var rangedif =ss.getRange(FirstEmptyA+1,3,dif-1)
var EmptyArow =ss.getRange(FirstEmptyA,3)
var validationList = SpreadsheetApp.newDataValidation().requireValueInList(['PLACE','MALL','BANK','SCHOOL'], true).build()
if(FirstEmptyA - FirstEmptyC < 0){
rangedif.clearDataValidations();
rangedif.clearContent();
}
else if(FirstEmptyC - FirstEmptyA < 0) {
rangeA.setDataValidation(validationList);
rangedif.setValue('PLACE');
}
else if (FirstEmptyC-FirstEmptyA = 0){
EmptyArow.setDataValidation(validationList);
setValue('C' + FirstEmptyC,'PLACE');
}
}
// From answer https://stackoverflow.com/a/9102463/1677912
function getFirstEmptyRow(range) {
var spr = SpreadsheetApp.getActiveSpreadsheet();
var column = spr.getRange(range);
var values = column.getValues();
var ct = 0;
while ( values[ct] && values[ct][0] != "" ) {
ct++;
}
return (ct);
}
Я пробовал много разных методов if else, чтобы не оказать никакой реальной помощи, потому что я не могу получить журнал, когда использую функцию onChange
в действии. если я запускаю onChange
в редакторе сценариев, все работает нормально, но если я что-то редактирую на листе, он возвращает доброе старое []
Вещи все еще случаются, но журналы не дают мне много информации. Я думаю, что это связано с ячейкой, которую я редактирую, не в столбце C.
Кроме этого, когда я заставляю его что-то делать, размещение "PLACE" или datavalidation, как правило, немного не в порядке. Потому что я пытаюсь компенсировать это, добавляя или вычитая цифры, чтобы они не были равны 0. Есть идеи, как решить эту проблему?
РЕДАКТИРОВАТЬ 5/17/2019
ПОЛУЧИЛ ЭТО!
function onChange(e){
var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var FirstEmptyA = getFirstEmptyRow('A:A');
Logger.log(FirstEmptyA);
var FirstEmptyC = getFirstEmptyRow('C:C');
Logger.log(FirstEmptyC);
var dif = Math.abs(FirstEmptyA - FirstEmptyC);
Logger.log(dif);
var EmptyArow =ss.getRange(FirstEmptyA ,3)
var validationList = SpreadsheetApp.newDataValidation().requireValueInList(['OASIS','LAT','CQ','MDR'], true).build()
if(FirstEmptyA - FirstEmptyC < 0){
var rangedif =ss.getRange(FirstEmptyA+1,3,dif)
rangedif.clearDataValidations();
rangedif.clearContent();
}
else if(FirstEmptyC - FirstEmptyA < 0) {
var rangedif =ss.getRange(FirstEmptyC +1,3,dif)
rangedif.setDataValidation(validationList);
rangedif.setValue('OASIS');
}
}
function getFirstEmptyRow(range) {
var spr = SpreadsheetApp.getActiveSpreadsheet();
var column = spr.getRange(range);
var values = column.getValues();
var ct = 0;
while ( values[ct] && values[ct][0] != "" ) {
ct++;
}
return (ct);
}
Честно говоря, это просто вопрос сдвига кода и добавления чисел в определенных областях. Получение пустой C вместо A на секунду, если функция else.