получить разницу между последней строкой двух столбцов, чтобы добавить значения в ячейки, делая столбцы равными по длине - PullRequest
0 голосов
/ 17 мая 2019

У меня есть запрос, собирающий имена из основного списка и помещающий их на лист. Поскольку он добавляет и убирает имена из этого листа, я хотел добавить и убрать выпадающие списки подтверждения данных, которые соответствуют именам.

Так что мне пришла в голову идея найти последнюю строку столбца 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.

Ответы [ 2 ]

0 голосов
/ 17 мая 2019

Ответил на мой вопрос, проверьте выше.Спасибо, Аунг49.Я, конечно, дважды проверил.думаю, мне просто нужно немного поспать.

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);
}
0 голосов
/ 17 мая 2019

Я вижу, что ваш getFirstEmptyRow(range) возвращает строку с нулевым индексом.Но вы используете его, чтобы получить пустую строку в var EmptyArow =ss.getRange(FirstEmptyA,3), которая даст вам строку над пустой строкой.Попробуйте исправить это и дайте нам знать, работает ли он или нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...