我正在尝试在Google Apps脚本的公式中包含变量列。我只有这些列的编号作为信息-在另一张纸上定义为输入值。并且输入值可以更改。例如:我不想在公式中使用“ 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');`
我希望最终结果是通过存储在“输入”表中的列号(即通过变量firstColValue
和secondColValue
)显示“ G1”和“ H1” 。因为下次我可能想拥有('= P1 + T1')。
非常感谢!
答案 0 :(得分:1)
问题
OP正在尝试使用变量构建setFormula
所分配的公式。
这不是一个新话题;例如请参阅SpreadsheetApp how to use variable inside formula或Google App Script: Trying to setFormula for Spreadsheet cell。将OP的问题与众不同的是,OP不想这样使用变量名,而是要使用作为对列的引用的值。
解决方案
单元格A1和A2各自包含一个表示列号的数字。这些数字需要更改为字母才能包含在公式中。子例程columnToLetter(column)
是执行此操作的有效方法。
公式已插入“测试”表中。这要求公式中必须包含“输入”工作表名称。对于如何获取工作表名称,我显示了两个选项:1)从变量值获取;和2)使用getSheetByName().getName()
。
该公式可以直接内置到setFormula
中,也可以作为分配给setFormula
的变量。后一种方法的好处是,在开发过程中,可以使用Logger语句显示公式的输出。这两个选项都包含在代码中。
关于“转义字符” 在OP的情况下,工作表是单个单词,并且公式并不复杂,不能包含空格,逗号,冒号或正斜杠等字符。结果是不需要转义任何字符。如果不是这种情况,那么有必要转义一些字符,在这种情况下,此brief note on Escaping Characters和有关该主题的代码示例可能会有所帮助。
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;
}
单元格和公式值的汇总
信用 “ columnToLetter”(这里不包括“ letterToColumn”) AdamL(https://stackoverflow.com/a/21231012/1330560)