范围选择并在该选择中复制固定值(来自单元格)

时间:2019-02-17 21:58:57

标签: google-apps-script google-sheets

背景

我有一些代码应该根据单元格E1,J1和I1中的整数值将表格B中的某些行复制到表格A中。 E1具有日期格式。将行从工作表B复制到A后,我需要在第12列(L列)中填入从E1到新添加的行的日期。 https://docs.google.com/spreadsheets/d/15pTVfcoxM2wQTMC-3iLzXVXIEEaZFYXaOf97amy4yRg/edit?usp=sharing

问题

最后三行代码运行不正常。即使我试图为同一列12(L列)选择范围,也似乎选择了多列和2行,这超出了我的预期。

function test() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("B");
  var aa = sheet.getRange("E1");
  var Date = aa.getValue();
  var aa = sheet.getRange("J1");
  var lastrow = aa.getValue();
  var aa = sheet.getRange("I1");
  var lastrowV = aa.getValue();
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("A");
  var range = sheet.getRange(2, 1, lastrowV, 11);
  var data = range.getValues();
  sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("B");
  sheet.getRange(lastrow, 1, data.length, 11).setValues(data); /* cell J1 gets updated after this*/
  var aa = sheet.getRange("J1");
  var lastrowN = aa.getValue() - 1;
  range = sheet.getRange(lastrow, 12, lastrowN, 12);
  range.activate();
  sheet.getRange(lastrow, 12, lastrowN, 12).setValues(Date);
}

1 个答案:

答案 0 :(得分:0)

背景

OP尝试在行尾的单元格中插入给定日期。但是,OP对范围的定义是错误的,因为它选择了多列(当只需要一列时),并且行数比所需的行数大(多了2(两))。此外,无论范围高度如何,OP都将尝试在范围内设置单个值(而不是数组)。

问题

1)日期列(L列)的定义包括一个列数的值(可能是较早定义数据范围的结转值)。 旧范围:getRange(lastrow,12, lastrowN, 12);。删除最后一个参数(列数),代码将起作用。

2)代码使用此方法setValues(Date)填充日期列(OP的示例数据中的8行)。这里的问题是分配的值是单个值Date。不是数组。通过创建并填充临时数组datearray,并使用它来更新日期列中的值,可以解决此问题。

3)除了指出的问题外,OP代码还有一个问题,即在完全不同的上下文(包括“工作表”和“ aa”)中重用了许多变量名,并且多次声明了一些变量。这使得代码难以阅读和调试。我借此机会解决了尽可能多的问题。

function so5473808801() {

  // setup spreadsheet and sheets
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheetB = ss.getSheetByName("B");
  var sheetA = ss.getSheetByName("A");

  // define key variables
  // date
  var daterange = sheetB.getRange("E1");
  var datevalue = daterange.getValue();

  // rows on SheetA
  var Arows = sheetB.getRange("I1"); // = 9
  var Alastrow = Arows.getValue();

  // rows on sheet B
  var Brows = sheetB.getRange("J1"); // = 3
  var Blastrow = Brows.getValue();

  // define the data range on Sheet A
  var Adatarange = sheetA.getRange(2, 1, Alastrow, 11);
  // Logger.log("DEBUG: The defined range on Sheet A is "+Adatarange.getA1Notation());//DEBUG 
  var Adatavals = Adatarange.getValues();

  // define a target range on Sheet B and set values from A
  var targetrange = sheetB.getRange(Blastrow, 1, Adatavals.length, 11);
  // Logger.log("DEBUG: The target on sheetB  = "+targetrange.getA1Notation()); // DEBUG
  targetrange.setValues(Adatavals);

  // set a range to update date on Sheet B
  var daterows = (Alastrow - 1); // doesn't take 2 row header on B intoi account
  var Bdaterange = sheetB.getRange(Blastrow, 12, daterows);
  // Logger.log("DEBUG: The date range on sheet B = "+Bdaterange.getA1Notation());

  // create an array to store multiple copies of datevalue
  var datearray = [];
  //populate the array
  for (var i = 0; i < daterows; i++) {
    datearray.push([datevalue]);
  }

  // set the date into Column L
  Bdaterange.setValues(datearray);

}