【问题标题】:Add a single cell's value to the first row of array being written via google script将单个单元格的值添加到通过谷歌脚本写入的数组的第一行
【发布时间】:2020-02-13 04:43:44
【问题描述】:

目标
使用 Google Script 将数据从一张表写入另一张“数据库”表。

当前状态
当填写“表单”选项卡并单击绿色按钮时,将触发一个脚本,将数据从“表单”写入“更改订单数据库”选项卡或“行项目数据库”选项卡。将数据写入 Change Order DB 选项卡可以按需要正常工作,没有问题。将数据写入“行项目数据库”选项卡失败。

遇到的问题
脚本运行时,应将“表单”选项卡上的第 10-50 行写入“行项目数据库”选项卡。我想将在表单选项卡 B7 上找到的 ID# 添加到正在写入的数组的每个行项中。我附上了显示所需结果的屏幕截图。如屏幕截图所示,该脚本应将数据写入 Line Item DB 选项卡。 A 列是更改顺序 #(来自表格选项卡上的单元格 B7,然后每一行是第 10-50 行的数组。

当前脚本

function SubmitChangeOrder() {
         var sheet = SpreadsheetApp.getActiveSpreadsheet();  
         var sheet = SpreadsheetApp.getActiveSpreadsheet();
         var form = sheet.getSheetByName('Form');
         var codb = sheet.getSheetByName('Change Order DB');
         var lidb = sheet.getSheetByName('Line Item DB');

         var lirows = form.getLastRow();
         var lineitems = form.getRange(10,1,lirows,3);
         var lidestination = lidb.getRange(lidb.getLastRow()+1,2,lirows,3);
         var sourcedata = lineitems.getValues();

         var date = form.getRange('E7').getValue();
         var customer = form.getRange('B3').getValue();
         var re = form.getRange('B5').getValue();
         var coid = form.getRange('B7').getValue();
         var total = form.getRange('G5').getValue();
         var status = form.getRange('G3').getValue();
         var codestination = codb.getRange(codb.getLastRow()+1,1,1,6);


         codestination.setValues([ [coid, date, customer, re, total, status] ]);
         lidestination.setValues(sourcedata);

}

脚本问题
代码的最后一部分,lidestination.setValues(sourcedata); 正确写入了第 10-50 行的数据,我只想将 ID# 添加到正在写入的每一行。

我有一个带有几个标签的谷歌表格。 link to the example

【问题讨论】:

  • 查看array.unshift()

标签: javascript arrays google-apps-script google-sheets google-apps


【解决方案1】:

您需要遍历sourcedata 数组,将coid 添加到每个嵌套数组的开头。有多种方法可以做到这一点,但我选择使用concat() 创建一个新数组。 (给定变量名,我认为它不应该被修改,否则它就不是“源”。)

我对您的代码进行了其他一些小调整,您可以在 cmets 中看到这些调整。最重要的是,原始代码将getLastRow()getRange() 所需的numRows 参数混合在一起。

function SubmitChangeOrder() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var form = sheet.getSheetByName('Form');
  var codb = sheet.getSheetByName('Change Order DB');
  var lidb = sheet.getSheetByName('Line Item DB');

  const li_start_row = 10; // Use a variable for clarity
  var numRows = form.getLastRow() - li_start_row + 1; // Calculate the number of line item rows
  var lineitems = form.getRange(li_start_row,1,numRows,3); // Select number of rows, not the row limit
  var lidestination = lidb.getRange(lidb.getLastRow()+1,1,numRows,4); // 4 columns, because adding Change Order #
  var sourcedata = lineitems.getValues();

  var date = form.getRange('E7').getValue();
  var customer = form.getRange('B3').getValue();
  var re = form.getRange('B5').getValue();
  var coid = form.getRange('B7').getValue();
  var total = form.getRange('G5').getValue();
  var status = form.getRange('G3').getValue();
  var codestination = codb.getRange(codb.getLastRow()+1,1,1,6);

  // Create a new table with sourcedata, but with the Change Order #
  // added to the beginning of each row
  var li_db_values = [];
  for (var i = 0; i < sourcedata.length; i++) {
    li_db_values.push([coid].concat(sourcedata[i]));
  }

  codestination.setValues([ [coid, date, customer, re, total, status] ]);
  lidestination.setValues(li_db_values);
}

您可以做更多的事情来清理代码并提高性能。如果您有时间,我强烈建议您查看最佳实践,特别是 batch operations section

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多