Google apps script Google表单使用公式值添加行

Google apps script Google表单使用公式值添加行,google-apps-script,google-sheets,google-sheets-formula,google-sheets-macros,Google Apps Script,Google Sheets,Google Sheets Formula,Google Sheets Macros,我的目标是在Google Sheets中编写一个脚本,将两个(或更多)值从工作表上一行的特定单元格复制到另一行的列表底部。我需要复制实际值以及从原始值计算附加值 这是我的第一次尝试,应该说明我正在尝试做什么: function CopyCals() { var spreadsheet = SpreadsheetApp.getActive(); spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Sheet2'), tru

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

这是我的第一次尝试,应该说明我正在尝试做什么:

   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的值,并在公式中使用它们,如我最初的尝试所示。

获取所需数据 这可能更容易编写:

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=[[B30中的值],[B31中的值]]因此vA[0][0]是B30,vA[1][0]是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)]);
}
所有这些功能都做同样的事情,你可以根据你想要完成的任务来选择你想要的功能

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)]);
}