Неверная высота диапазона, была 1, но должна быть 344 - при попытке перенести диапазон на другой лист с помощью .setValues ()

1

Я пытаюсь выполнить цикл данных, искать определенное значение в первом столбце данных, а затем скопировать все строки с этим значением в другой лист, называемый "Закрытые запросы",

function copyToClosed(){

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("Open Requests");
  var range = sheet.getActiveCell();

  var lastrow = sheet.getLastRow();
  var datarange = sheet.getRange(10,2,lastrow-1, 50).getValues();
  var row = 10;
  var x = [];

  var sheetNameToMoveTheRowTo = "Closed Requests"
  var targetSheet = ss.getSheetByName(sheetNameToMoveTheRowTo);

  for (i=0;i<datarange.length;i++) {

      if(i[0] == "CC") {
        x.push([datarange[i]])
      }
  var targetRange = 
  targetSheet.getRange
  (targetSheet.getLastRow()+1,2,datarange.length,datarange[0].length)
  targetRange.setValues(x)

  }
}

Как вы можете видеть, я сначала определяю datarange и создаю массив "x". Затем я просматриваю данные, чтобы найти текст "CC" в первом столбце диапазона. Затем я выталкиваю эти строки в массив и копирую их на лист "Закрытые запросы" с помощью.setValues(). Я получаю сообщение об ошибке в.setValues()

Просматривая другие случаи этой ошибки, я понял, что должна быть проблема с размером моего массива и что я неправильно определил либо массив, либо диапазон. Однако я не могу понять, в чем именно проблема.

Любая помощь будет оценена по достоинству.

  • 0
    1-й не должен i [0] быть datarange [i] [0], а 2-й не должен datarange.length и datarange [0] .length быть x.length и x [0] .length, а 3-й не должно быть закрытие} перед var targetRange =
Теги:
google-apps-script
setvalue
google-sheets

2 ответа

1
Лучший ответ

Ошибки находятся в цикле for. Попробуй это:

function copyToClosed(){
 var ss = SpreadsheetApp.getActiveSpreadsheet();
 var sheet = ss.getSheetByName("Open Requests");
 var range = sheet.getActiveCell();
 var lastrow = sheet.getLastRow();
 var datarange = sheet.getRange(10,2,lastrow-1, 50).getValues();
 var row = 10;
 var x = [];
 var sheetNameToMoveTheRowTo = "Closed Requests"
 var targetSheet = ss.getSheetByName(sheetNameToMoveTheRowTo);
 for (i=0;i<datarange.length;i++) {
      if(datarange[i][0] == "CC") {
       x.push(datarange[i])
     }}  
 targetSheet.getRange(targetSheet.getLastRow()+1,2,x.length,x[0].length).setValues(x)
 }
  • 0
    спасибо, это прекрасно работает
  • 0
    Если это работает для вас, не могли бы вы одобрить ответ, нажав на флажок слева от ответа.
0

Другой вариант, который может работать, - это заставить его запускать onEdit, поэтому, когда значение будет изменено на CC, он автоматически переместит строку. вы можете сделать это, используя следующий код

    function onEdit(event) {
  // assumes source data in sheet named Active
  // target sheet of move to named Found 
  // test column with yes/no is col 13 or M
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s = event.source.getActiveSheet();
  var r = event.source.getActiveRange();

  if(s.getName() == "Open Requests" && r.getColumn() == 1 && r.getValue() == 'CC') {
    var row = r.getRow();
    var numColumns = s.getLastColumn();
    var targetSheet = ss.getSheetByName("Closed Requests");
    var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
    s.getRange(row, 1, 1, numColumns).moveTo(target);
    s.deleteRow(row);
  }

}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню