带有公式值的Google表格appendRow

时间:2019-03-11 00:13:56

标签: google-apps-script google-sheets google-sheets-formula google-sheets-macros

我的目标是在Google表格中编写一个脚本,该脚本会将工作表上单行中特定单元格的两个(或更多)值复制到另一个列表的底部。我需要复制实际值并从原始值中计算出其他值。

这是我的第一次尝试,应该解释一下我要做什么:

   function CopyCals() {
   var spreadsheet = SpreadsheetApp.getActive();
   spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Sheet2'), true);
  spreadsheet.appendRow(['=today()','','=Sheet1!B30','=Sheet1!E30','=Sheet1!B30-Sheet1!E30','=Sheet1!B30-(Sheet1!E30-2500)']);
      };

这很好用,除了它会附加实际的公式而不是字段的值。随着字段的更改,复制内容的值也会更改。

要解决此问题,我尝试了getRange,但是我不知道如何选择数组中的特定元素(即C30和E30的值)。下面是我尝试过的:

function copyCals2() {
  var spreadsheet = SpreadsheetApp.getActive();
  var range = spreadsheet.getRange("B30:E30").getValues();
  spreadsheet.appendRow(range[0]);
  };

如何获取appendRow以仅打印C30和E30的值,并将其用于公式中,如我最初的尝试所示。

1 个答案:

答案 0 :(得分:0)

获取所需数据

function CopyCals() {
  var ss=SpreadsheetApp.getActive();
  var sh1=ss.getSheetByName('Sheet1');
  var sh2=ss.getSheetByName('Sheet2');
  sh2.appendRow([new Date(),'',sh1.getRange('B30').getValue(),sh1.getRange('E30').getValue(),sh1.getRange('B30').getValue()-sh1.getRange('E30').getValue(),sh1.getRange('B30').getValue()-(sh1.getRange('E30').getValue()-2500)]);
};

这可能更容易编写:

function CopyCals() {
  var ss=SpreadsheetApp.getActive();
  var sh1=ss.getSheetByName('Sheet1');
  var sh2=ss.getSheetByName('Sheet2');
  var b30=sh1.getRange('B30').getValue();
  var e30=sh1.getRange('E30').getValue();
  sh2.appendRow([new Date(),'',b30,e30,b30-e30,b30-(E30-2500)]);
  //sh2.appendRow([new Date(),'',sh1.getRange('B30').getValue(),sh1.getRange('E30').getValue(),sh1.getRange('B30').getValue()-sh1.getRange('E30').getValue(),sh1.getRange('B30').getValue()-(sh1.getRange('E30').getValue()-2500)]);
}

我可能更喜欢这样做:

function CopyCals() {
  var ss=SpreadsheetApp.getActive();
  var sh1=ss.getSheetByName('Sheet1');
  var sh2=ss.getSheetByName('Sheet2');
  var vA=sh1.getRange('B30:B31').getValues();
  var b30=vA[0][0];
  var b31=vA[1][0];
  //var b30=sh1.getRange('B30').getValue();
  //var e30=sh1.getRange('E30').getValue();
  sh2.appendRow([new Date(),'',b30,e30,b30-e30,b30-(E30-2500)]);
  //sh2.appendRow([new Date(),'',sh1.getRange('B30').getValue(),sh1.getRange('E30').getValue(),sh1.getRange('B30').getValue()-sh1.getRange('E30').getValue(),sh1.getRange('B30').getValue()-(sh1.getRange('E30').getValue()-2500)]);
}

如果您有大量数据,并且将它们很好地分组在一起,则后者可以节省大量时间,因为您只需一次读取即可一次获取所有数据。

在后一种方法中,使用调试器来帮助您了解数据的外观很有帮助:

vA=[[value in B30],[value in B31]] so the vA[0][0] is B30 and vA[1][0] is B31

这是编写getRange()函数的另一种方法:

function CopyCals() {
  var ss=SpreadsheetApp.getActive();
  var sh1=ss.getSheetByName('Sheet1');
  var sh2=ss.getSheetByName('Sheet2');
  var vA=sh1.getRange(30,2,2,1).getValues();
  //var vA=sh1.getRange('B30:B31').getValues();
  var b30=vA[0][0];
  var b31=vA[1][0];
  //var b30=sh1.getRange('B30').getValue();
  //var e30=sh1.getRange('E30').getValue();
  sh2.appendRow([new Date(),'',b30,e30,b30-e30,b30-(E30-2500)]);
  //sh2.appendRow([new Date(),'',sh1.getRange('B30').getValue(),sh1.getRange('E30').getValue(),sh1.getRange('B30').getValue()-sh1.getRange('E30').getValue(),sh1.getRange('B30').getValue()-(sh1.getRange('E30').getValue()-2500)]);
}

多次使您的事情变得更加复杂,一次获取整个值的页面很有帮助,因此在这种情况下,这就是您所剩的。

function CopyCals() {
  var ss=SpreadsheetApp.getActive();
  var sh1=ss.getSheetByName('Sheet1');
  var sh2=ss.getSheetByName('Sheet2');
  var vA=sh1.getDataRange().getValues();
  var b30=vA[29][1];
  var b31=vA[30][1];
  //var vA=sh1.getRange('B30:B31').getValues();//gets all the data at one time
  //var b30=vA[0][0];
  //var b31=vA[1][0];
  //var b30=sh1.getRange('B30').getValue();
  //var e30=sh1.getRange('E30').getValue();
  sh2.appendRow([new Date(),'',b30,e30,b30-e30,b30-(E30-2500)]);
  //sh2.appendRow([new Date(),'',sh1.getRange('B30').getValue(),sh1.getRange('E30').getValue(),sh1.getRange('B30').getValue()-sh1.getRange('E30').getValue(),sh1.getRange('B30').getValue()-(sh1.getRange('E30').getValue()-2500)]);
}

所有这些功能都可以执行相同的操作,您可以根据要完成的任务选择想要的功能。