Выбор диапазона и копирование фиксированного значения (из ячейки) в этот выбор - PullRequest
0 голосов
/ 18 февраля 2019

Фон

У меня есть код, который должен копировать определенные строки из листа B в лист A на основе целочисленных значений в ячейках E1, J1 и I1.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 голосов
/ 18 февраля 2019

Фон

ОП пытается вставить указанную дату в ячейку в конце строки.Однако определение диапазона в OP неверно, поскольку он выбирает несколько столбцов (когда требуется только один столбец), а количество строк больше (на 2 (два)), чем требуемое количество.Кроме того, независимо от высоты диапазона OP пытается установить в диапазон одно значение (а не массив).

Проблемы

1)определение столбца даты (столбец L) включало значение для числа столбцов (вероятно, переход от определения диапазона данных ранее).Старый диапазон: getRange(lastrow,12, lastrowN, 12);.Удалите последний параметр (количество столбцов), и код будет себя вести.

2) Код использовал этот метод setValues(Date) для заполнения столбца даты (8 строк в данных примера OP).проблема здесь в том, что назначенное значение является единственным значением Date.не массив.Это было решено путем создания и заполнения временного массива datearray и использования его для обновления значений в столбце даты.

3) В дополнение к отмеченным проблемам, код OP проблематичен тем, что рядимена переменных были повторно использованы в совершенно разных контекстах (включая «лист» и «аа»), а некоторые переменные были объявлены несколько раз.Это затруднило чтение и отладку кода.Я воспользовался возможностью, чтобы решить как можно больше из них.

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

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...