Скрипт Google Apps загадочным образом перестает функционировать в цикле for - PullRequest
0 голосов
/ 18 мая 2018

Я строю систему для копирования данных с одного листа на другой (в другой электронной таблице).Работает хорошо, пока не предполагается копировать данные.После этого он ничего не делает.Не выдается никакой ошибки, но в цикле for не появляется всплывающих окон.Вот мой код:

function onEdit() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var master = SpreadsheetApp.openById('13x7AvyYTaocCVBxVZ3ckBjzgxcZfjg9RYM1cE_0VNbU');
  var sheets = master.getSheets();
  var test = DriveApp.createFile('Test', 'fetching user data...');
  var name = test.getOwner().getName();
  test.setTrashed(true);
  var add = true;
  for (var i = 0, n; i < sheets.length; i++) {
    n = sheets[i];
    if (n.getName() == name) {
      add = false;
      updateSheet(n, name);
    }
  }
  if (add) {
    newSheet(master, name);
  }
}

function updateSheet(m, name) {
  var sheet = SpreadsheetApp.getActiveSheet();
  var range = sheet.getRange(1, 1, sheet.getLastRow(), sheet.getLastColumn());
  var nr = range.getNumRows();
  var nc = range.getNumColumns();
  for (var i = 1; i <= nr.length; i++) {
    for (var n = 1, s; n <= nc.length; n++) {
      s = range.getCell(i, n);
      m.getRange(i, n).getCell(1, 1).setValue(s.getValue());
    }
  }
}

function newSheet(master, name) {
  var m = master.insertSheet(name);
  var sheet = SpreadsheetApp.getActiveSheet();
  var range = sheet.getRange(1, 1, sheet.getLastRow(), sheet.getLastColumn());
  var nr = range.getNumRows();
  var nc = range.getNumColumns();
  for (var i = 1; i <= nr.length; i++) {
    for (var n = 1, s; n <= nc.length; n++) {
      s = range.getCell(i, n);
      m.getRange(i, n).getCell(1, 1).setValue(s.getValue());
    }
  }
}

Я искал код, но не могу найти ничего неправильного.

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

Очевидный ответ (Спасибо @ Рубен)

В цикле for написано nc.length и nr.lengthgetNumRows, и getNumColumns возвращают числа.Поскольку это целые числа , .length не требуется.

0 голосов
/ 20 мая 2018

В документации Google на https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet#insertsheetsheetname, написано ...

insertSheet(sheetName)

Вставка нового листа в таблицу с указанным именем. Новый лист становится активным.

В вашем коде

function newSheet(master, name) {
  var m = master.insertSheet(name);  // after calling this function m becomes the active sheet
  var sheet = SpreadsheetApp.getActiveSheet();  // you've assigned m to sheet

Я бы рекомендовал использовать getSheetByName ('SheetName').

var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("SheetName");

Ссылка на эту ссылку https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet#getsheetbynamename

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