Как использовать переменные столбцы внутри моей формулы в Google Apps Script? - PullRequest
0 голосов
/ 17 февраля 2019

Я пытаюсь включить переменные столбцы в формулу в Google Apps Script.У меня есть только номера этих столбцов в качестве информации, определенные как входные значения на другом листе.И входное значение может быть изменено.Например: я не хочу, чтобы в формуле было «G1», но представляю его через столбец № 7. Ниже приведено простое представление о том, чего я пытаюсь достичь.

function variableColumn() {
  var report = SpreadsheetApp.getActiveSpreadsheet();
  var mainSheet = report.getSheetByName('Test');
  var inputSheet = report.getSheetByName('Input');

  // Current stored value in "A1" is 7 (corresponding to the "G" column)
  var firstColRange = inputSheet.getRange("A1");
  var firstColValue = firstColRange.getValues();

  // Current stored value in "A2" is 8 (corresponding to the "H" column) 
  var secondColRange = inputSheet.getRange("A2"); 
  var secondColValue = secondColRange.getValues();     

  var range = sheet.getRange("A1");
  range.setFormula('=G1 + H1');`

ЧтоЯ ожидаю в качестве окончательного результата представить «G1» и «H1» через номера их столбцов, хранящиеся на листе «Input», то есть через переменные: firstColValue AND secondColValue.Потому что в следующий раз я захочу иметь ('= P1 + T1').

Большое спасибо заранее!

1 Ответ

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

Задача
ОП пытается использовать переменные в построении формулы для присваивания setFormula.

Это не новая тема;например, обратитесь к SpreadsheetApp, как использовать переменную внутри формулы или Google App Script: Попытка установить форму для ячейки таблицы .Особенность проблемы ОП заключается в том, что ОП не хочет использовать имя переменной как таковое, а скорее значение, которое является ссылкой на столбец.

Решение

  • Каждая ячейка A1 и A2 содержит число, обозначающее номер столбца.Эти цифры необходимо заменить на буквы для включения в формулу.Подпрограмма columnToLetter(column) - эффективный способ сделать это.

  • Формула вставлена ​​в лист «Тест».Для этого необходимо, чтобы имя «Входные данные» было включено в формулу.Я показал два варианта получения имени листа: 1) из значения переменной;и 2) используя getSheetByName().getName().

  • Формула может быть встроена непосредственно в setFormula или как переменная, которая присваивается setFormula.Преимущество последнего подхода заключается в том, что во время разработки оператор Logger может использоваться для отображения выходных данных формулы.Обе опции включены в код.

О «экранирующих символах» В сценарии ОП листы представляют собой отдельные слова, и формула не так сложна, чтобывключают такие символы, как пробелы, запятые, двоеточие или косая черта.Эффект состоит в том, что никакие символы не должны быть экранированы.Если бы это было не так, то было бы необходимо экранировать некоторые символы, в этом случае может быть полезна краткая заметка об экранирующих символах и пример кода на эту тему.

function so5473414301() {

  // setup spreadsheet
  var report = SpreadsheetApp.getActiveSpreadsheet();

  // define sheets
  // Note: two ways to refer to a sheet name
  // 1 = put the name in a variable -> then getSheetByName(variable)
  // 2 = put the sheet name in method -> report.getSheetByName('Input'). Then get name using .getName()
  var mainSheetName = "Test";
  var mainSheet = report.getSheetByName(mainSheetName);
  //Logger.log("DEBUG: mainsheet name:"+mainSheet.getName()); //DEBUG

  var inputSheet = report.getSheetByName('Input');
  var inputSheetName = inputSheet.getName();
  //Logger.log("DEBUG: inputheet name: "+inputSheet.getName()); //DEBUG


  // Current stored value in "A1" is 7 (corresponding to the "G" column), and convert to the equivalent column letter
  var firstColRange = inputSheet.getRange("A1");
  var firstColValue = firstColRange.getValues();
  //Logger.log("DEBUG: fircolRange = "+firstColRange.getA1Notation()+", value = "+firstColValue); //DEBUG
  // get the columnletter for that column number
  var firstcolname = columnToLetter(firstColValue)
  //Logger.log("DEBUG: firstcolname = "+firstcolname); //DEBUG


  // Current stored value in "A2" is 8 (corresponding to the "H" column), and convert to the equivalent column letter
  var secondColRange = inputSheet.getRange("A2"); 
  var secondColValue = secondColRange.getValues();     
  //Logger.log("secondColRange = "+secondColRange.getA1Notation()+", value = "+secondColValue);
  // get the columnletter for that column number
  var secondcolname = columnToLetter(secondColValue);
  //Logger.log("DEBUG: secondcolname = "+secondcolname); //DEBUG


  // define the location for the formula
  var outputrange = mainSheet.getRange("A3");

  // construct the formula
  // The formula should output as '=Input!G1+Input!H1
  // Note 2 options here
  // 1 - Build the formula straight into the `setFormula`
  // 2 - Build the formula and assign it to a variable, then use the variable in the `setFormula`

  // Option#1
  //outputrange.setFormula("="+inputSheet.getName()+"!"+firstcolname+"1+"+inputSheet.getName()+"!"+secondcolname+"1");

  // Option#2
  // Build the formula - Looger will show the formula as converted.
  var formula = "="+inputSheet.getName()+"!"+firstcolname+"1+"+inputSheet.getName()+"!"+secondcolname+"1";
  Logger.log("DEBUG: The formula is: "+formula);//DEBUG

  // set the formula in the outputrange
  var output = outputrange.setFormula(formula);

}

function columnToLetter(column)
{
  var temp, letter = '';
  while (column > 0)
  {
    temp = (column - 1) % 26;
    letter = String.fromCharCode(temp + 65) + letter;
    column = (column - temp - 1) / 26;
  }
  return letter;
}

Сводка значений ячеек и формул

Summary of cell and formula values

Credit"columnToLetter"(плюс «letterToColumn» здесь не входит) AdamL (https://stackoverflow.com/a/21231012/1330560)

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