背景
我有一些代码应该根据单元格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);
}
答案 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);
}