Задача
ОП пытается использовать переменные в построении формулы для присваивания 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;
}
Сводка значений ячеек и формул
Credit"columnToLetter"(плюс «letterToColumn» здесь не входит) AdamL (https://stackoverflow.com/a/21231012/1330560)