如何在Google Apps脚本的公式中使用变量列?

时间:2019-02-17 14:18:25

标签: google-apps-script

我正在尝试在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');`

我希望最终结果是通过存储在“输入”表中的列号(即通过变量firstColValuesecondColValue)显示“ G1”和“ H1” 。因为下次我可能想拥有('= P1 + T1')。

非常感谢!

1 个答案:

答案 0 :(得分:1)

问题
OP正在尝试使用变量构建setFormula所分配的公式。

这不是一个新话题;例如请参阅SpreadsheetApp how to use variable inside formulaGoogle 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;
}

单元格和公式值的汇总

Summary of cell and formula values

信用 “ columnToLetter”(这里不包括“ letterToColumn”) AdamL(https://stackoverflow.com/a/21231012/1330560