Google Sheets: INDIRECT () с диапазоном - PullRequest
0 голосов
/ 05 февраля 2019

Этот вопрос можно перефразировать так: «Использование программно сгенерированного диапазона в FILTER ()» в зависимости от подхода, который требуется для его ответа.

РЕДАКТИРОВАТЬ - Кажется, я случайно включил слишком много информации в свойпопытки продемонстрировать то, что я пытался, чтобы мой вопрос был неясным.Изменения, которые я сделал в этом редакторе, должны исправить это.

В настоящее время я выполняю фильтрацию, используя следующую функцию:

Блок кода 1

=filter('Data Import'!1:10000,'Data Import'!D:D<12)

После импорта данных столбец D:D может изменять позиции (например, он может находиться в столбце F:F), но всегда имеет заголовок "student.grade".

Вопрос: Как можноЯ ссылаюсь на этот столбец переменной позиции с фиксированным заголовком в функции фильтра, как в столбце, указанном в кодовом блоке 1? Другими словами, могу ли я заменить «Импорт данных»! D: D` действительным кодом, который позволитэта функция работает независимо от расположения столбца с заголовком "student.grade?"

Что я пробовал:

Я могу использовать следующий код, чтобы правильно найти адрес столбца (каким бы он ни был после импорта данных) какстрока:

Блок кода 2

=substitute(address(1,match("student.grade",'Data Import'!1:1,0),4),1,"")&":"&substitute(address(1,match("student.grade",'Data Import'!1:1,0),4),1,"")

Функция в блоке кода 2 возвращает "D:D", когда заголовок "student.grade" находится в ячейке D1 и "F:F", когда "student.grade" находится в ячейке F1.Я думал, что мог бы просто вставить это значение в функцию FILTER() и быть на моем веселом пути, но чтобы преобразовать мою строку в пригодный для использования адрес, я попытался использовать функцию INDIRECT() для строки, созданной в блоке кода 2.выше.

Кодовый блок 3

=filter('Data Import'!1:3351,'Data Import'!indirect(substitute(address(1,match("student.grade",'Data Import'!1:1,0),4),1,"")&":"&substitute(address(1,match("student.grade",'Data Import'!1:1,0),4),1,""),TRUE)<12)

Формула не будет правильно обрабатываться.

Упрощение косвенной части той же функции для проверкибудет ли он работать, если заданный диапазон вызывает ту же ошибку:

Кодовый блок 4

=filter('Data Import'!1:3351,indirect('Data Import'!&"D:D")<12)

Это заставляет меня поверить, что INDIRECT () необрабатывать диапазоны, или если это так, я не знаю синтаксис. Этот пост переполнения стека , кажется, предполагает, что это возможно, но я не могу разобраться в деталях.

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

Этот вопрос задается для понимания того, как передать переменный диапазон в функцию фильтра (если это возможно).

Ответы [ 3 ]

0 голосов
/ 08 февраля 2019

еще раз, может быть, это то, что вы хотите:

=FILTER('Data Import'!1:100000, 
 INDIRECT("'Data Import'!"&
 ADDRESS(1,       MATCH("student.grade", 'Data Import'!1:1, 0), 4)&":"&
 ADDRESS(1000000, MATCH("student.grade", 'Data Import'!1:1, 0), 4)) < 12)

0 голосов
/ 09 февраля 2019

Существующее решение OP основано на команде Filter.Проблема в том, что столбец, содержащий «student.grade», не является фиксированным, однако player0 предоставил отличное решение на основе формул.

Альтернативой может быть для использования именованного диапазона,Следующий код находит «student.grades» в заголовке (строка 1) и соответствующим образом переопределяет именованный диапазон.

function so54541923() {

  // setup the spreadsheet
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheetname = "Data Import";
  var sheet = ss.getSheetByName(sheetname);

  // define the header row
  var getlastColumn = sheet.getLastColumn();
  var headerRange = sheet.getRange(1, 1, 1, getlastColumn);
  Logger.log("DEBUG: Header range = " + headerRange.getA1Notation()); //DEBUG

  // assign a variable for student Grades
  var grades = "student.grade";

  // get the headers and find the column containing "student grades"
  var headerData = headerRange.getValues();
  var gradesIndex = headerData[0].indexOf(grades);
  // add one to the index number to account for start=zero
  gradesIndex = gradesIndex + 1;
  Logger.log("DEBUG: gradesIndex = " + gradesIndex); //DEBUG

  // convert the column number to a letter 
  // assumes that student.grade will never get past column Z
  var temp, letter = '';
  if (gradesIndex > 0) {
    temp = (gradesIndex - 1) % 26;
    letter = String.fromCharCode(temp + 65) + letter;
    gradesIndex = (gradesIndex - temp - 1) / 26;
  }
  Logger.log("DEBUG: the column is " + letter); //DEBUG

  //var newrange = "'" + sheetname + "'!"+letter+":"+letter+";";
  // Logger.log("the new range is "+newrange); 

  // get the named ranges
  var namedRanges = ss.getNamedRanges();
  Logger.log("DEBUG: number of ranges: " + namedRanges.length); //DEBUG

  // if named range is student grades, then update range
  if (namedRanges.length > 0) {
    for (var i = 0; i < namedRanges.length; i++) {
      var thename = namedRanges[i].getName();
      Logger.log("DEBUG: Loop: i: " + i + ", and the named range is " + thename); //DEBUG
      if (thename = "student.grade") {

        // Logger.log("DEBUG: The named range is student.grade");//DEBUG

        // set the new range based on the column found earlier
        var nonstringrange = sheet.getRange("'" + sheetname + "'!" + letter + ":" + letter);
        namedRanges[i].setRange(nonstringrange);
        Logger.log("DEBUG: The new range is " + namedRanges[i].getRange().getA1Notation()); //DEBUG

      } else {
        Logger.log("DEBUG: The named range is NOT grades"); //DEBUG
      }
    }
  }
}
0 голосов
/ 08 февраля 2019

Я понятия не имею, чего вы хотите достичь, но посмотрите на это:

={'Data Import'!1:1;
 FILTER('Data Import'!1:10000, 'Data Import'!D:D < 12)}

или:

=QUERY(FILTER('Data Import'!1:10000, 'Data Import'!D:D < 12), 
 "select * label Col4 'student.grade'", 0)

...