Google apps script 将数据从一张图纸保存到另一张图纸的最后一行

Google apps script 将数据从一张图纸保存到另一张图纸的最后一行,google-apps-script,google-sheets,Google Apps Script,Google Sheets,编辑以将代码添加到底部 我正在创建一张由员工填写的发票单,然后单击“保存并清除”按钮,该按钮将在销售报告中找到下一个空行,并将发票中的某些字段保存到销售报告中。我有两个可行的解决方案,但都似乎陷入了困境,需要一段时间才能完成。下面是一份我正在处理的工作表,我已经去掉了无关的信息。因为我已经把它剥光了,所以我对速度没有任何问题 我最初尝试创建一个数组,其中包含我想要保存的每个单元格,然后将它们放入报告中。然后,我在报告上复制并粘贴值,以防止清除功能删除发票和报告 第二,我有激活最后一行+1中某些单

编辑以将代码添加到底部

我正在创建一张由员工填写的发票单,然后单击“保存并清除”按钮,该按钮将在销售报告中找到下一个空行,并将发票中的某些字段保存到销售报告中。我有两个可行的解决方案,但都似乎陷入了困境,需要一段时间才能完成。下面是一份我正在处理的工作表,我已经去掉了无关的信息。因为我已经把它剥光了,所以我对速度没有任何问题

我最初尝试创建一个数组,其中包含我想要保存的每个单元格,然后将它们放入报告中。然后,我在报告上复制并粘贴值,以防止清除功能删除发票和报告

第二,我有激活最后一行+1中某些单元格的代码,然后在运行时复制/粘贴每个单元格的值

这两种方法都不是最有效的方法,但我不知道如何使用
getValues
setValues
函数。或者这些是否适用于我正在尝试做的事情

提前谢谢

第一次尝试(编辑):

第二次尝试(编辑):


这将帮助您开始批量值操作(和一些概念)。
要记住的关键是JavaScript数组是0-base,电子表格接口使用1-base:单元格A1又称单元格R1C1位于数组索引0,0处。
Apps脚本提供的
SpreadsheetApp
也将“主要维度”解释为行,因此“2D”JavaScript
数组的第一个索引是行,第二个索引是该特定行的列。(Sheets REST API可以指定数组应以列作为第一个索引进行解释。)

参考资料:


我在您的帖子中没有看到任何代码-您的帖子应该包含-在文本中-复制您的问题所需的MCVE。不鼓励使用链接文档,尤其是实时文档,因为它们对未来的访问者没有用处(即,您可能更改了代码)。我还建议您使用应用程序脚本API参考来理解特定的方法和类。它也有相当数量的指南和最佳实践——都有例子。从脚本编辑器:Help->API referenceAs和大多数录制的宏(无论是Excel还是Google Sheets),您几乎可以通过移除激活范围的拐杖,然后使用活动范围来大幅改进宏。这很有意义。我对这两个选项都做了一些更新,试图消除激活范围的额外呼叫。我将在原始帖子中发布更新的代码。我一直在使用API参考,但(显然)成功有限。请在问题中只保留相关代码。一个大问题往往被忽略,因为它似乎包含了不必要的细节,这通常反映了OP只是复制/粘贴代码,并且在提问之前没有调查问题的情况。作为进一步的步骤,您是否已经描述了这些操作需要多长时间?我希望第一种方法速度相当快,尽管我不确定您是如何得到使用的一些值的。我将返回并删除一些现在已经过时的代码。每种方法大约需要15-20秒。这似乎不是很长时间,但当你等待它完成时,感觉就像永远。代码的清晰部分现在是超级快速的,所以它必须来自其他部分。发票页值来自某些单元格,在发票完全填充后,我需要将这些单元格保存在发票上。销售报告表的值有点随机。我需要粘贴值,而不是公式,因为我正在清除发票。我试图找到最后一行,但失败了
data = ["=Invoice!$E$3", "=Invoice!$E$2","=row()+100000-2","=Invoice!$E$30","=Invoice!$E$4","=Invoice!$C$6","=Invoice!$C$10","=Invoice!$E$6","=Invoice!$E$10","Parts","=Invoice!$H$11"]
SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sales Report").appendRow(data);

var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sales Report");
sheet.getRange('$A$47:$K$100').copyTo(sheet.getRange('$A$47:$K$100'), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false); 

SpreadsheetApp.getActive().getSheetByName('Invoice').getRange(6,3 ).clearContent();
SpreadsheetApp.getActive().getRange('B12:C28').clearContent();
SpreadsheetApp.getActive().getRange('E29').clearContent();
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sales Report');
var row = spreadsheet.getLastRow() + 1;
spreadsheet.getRange('Invoice!E3').copyTo(spreadsheet.getRange('A' + row), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
spreadsheet.getRange('Invoice!E2').copyTo(spreadsheet.getRange('B' + row), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
spreadsheet.getRange('C' + (row - 1) + 1).copyTo(spreadsheet.getRange('C' + row), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
spreadsheet.getRange('Invoice!E30').copyTo(spreadsheet.getRange('D' + row), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
spreadsheet.getRange('Invoice!E4').copyTo(spreadsheet.getRange('E' + row), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
spreadsheet.getRange('Invoice!C6').copyTo(spreadsheet.getRange('F' + row), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
spreadsheet.getRange('Invoice!C10').copyTo(spreadsheet.getRange('G' + row), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
spreadsheet.getRange('Invoice!E6').copyTo(spreadsheet.getRange('H' + row), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
spreadsheet.getRange('Invoice!E10').copyTo(spreadsheet.getRange('I' + row), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
spreadsheet.getRange('J' + (row - 1)).copyTo(spreadsheet.getRange('J' + row), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
spreadsheet.getRange('Invoice!H11').copyTo(spreadsheet.getRange('K' + row), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);

SpreadsheetApp.getActive().getSheetByName('Invoice').getRange(6,3 ).clearContent();
SpreadsheetApp.getActive().getRange('B12:C28').clearContent();
SpreadsheetApp.getActive().getRange('E29').clearContent();
function logInvoice() {
  const wb = SpreadsheetApp.getActive(); // 'const' means we will not change what 'wb' means.
  const sales = wb.getSheetByName("Sales Reports");
  var lastSalesRow = sales.getLastRow(); // not 'const' since we will re-assign this primitive.

  const invoice = wb.getSheetByName("Invoice");
  const fullReport = invoice.getDataRange().getValues(); // Gets A1:___ into a 2D JS array
  const data = [
    fullReport[2][4], // E3
    fullReport[1][4], // E2
    /** I really don't know what you were doing with "=row() + 100000 - 2". If
     * you were just trying to get a unique identifier, then use the next line: */
    // Utilities.getUuid(),
    fullReport[29][4], // E30
    /**
     * add more elements as needed
     */
  ];

  // Write the summary data to the next row in the 'Sales Reports' sheet.
  // Grabs the cell "A#" and then uses the size of the data to write to determine
  // the size of the Range required.
  sales.getRange(++lastSalesRow, 1, data.length, data[0].length).setValues(data);

  // Reset the Invoice sheet to its blank slate.
  invoice.getRangeList([
    "C6", // R6C3
    "B12:C28",
    "E29"
  ]).clearContent();
}