Как мне искать, используя имя заголовка вместо жестких значений кода, а затем обновить соответствующие ячейки? - PullRequest
7 голосов
/ 07 октября 2019

В настоящее время у меня есть скрипт, который имитирует функцию VLOOKUP, как показано ниже -

function lookupUpdate() {

  // Test variables
  var HashID = "B2";
  var EditorName = "Jane";  

  var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var values = ss.getDataRange().getValues();
  for (var i = 0; i < values.length; i++) {
    if (values[i][0] == HashID) {
      // hard coding the value 2 as the 'EditorName' corresponds to Column B
      ss.getRange(i + 1, 2).setValue(EditorName);
      // trying to find a way to not hard code this value (2)
      break;
    }
  }
}

Схема моего листа довольно проста -

Sheet Data

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

Может ли это быть достигнуто без нарушения всего кода?

1 Ответ

7 голосов
/ 07 октября 2019

Обычно я делаю обновления, подобные VLOOKUP, используя функцию indexOf и, исходя из вашего сценария, я бы рекомендовал изменить код, как показано ниже -

function lookupUpdateNew() {

  var HashID = "B2";
  var EditorName = "Jane";  

  var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var values = ss.getDataRange().getValues();

  var headers = values[0];
  var hashIDIndex = headers.indexOf('HashID');
  var editorNameIndex = headers.indexOf('EditorName');

  for (var i = 0; i < values.length; i++) {
    if (values[i][hashIDIndex] == HashID) {
      ss.getRange(i + 1, editorNameIndex + 1).setValue(EditorName);
      break;
    }
  }
}

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

...