Как определить количество строк, вставленных в лист с помощью триггера onChange? - PullRequest
0 голосов
/ 28 марта 2019

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

Я бы хотел вставить / удалить строки во второй, в зависимости от того, какие строки были вставлены или удалены в первой.Они должны соответствовать предыдущим данным.

Я пытался использовать триггер onChange, чтобы определить, когда был обнаружен INSERT_ROW или REMOVE_ROW changeType.Он отлично работает, когда вставляется только строка, но не когда вставляется более одной строки.Кроме того, когда они вставляют строку и после отмены, действие changeType имеет значение EDIT, а не REMOVE_ROW.Сбой.

Затем я решил добавить скрытый столбец с порядковым номером в каждой строке, поэтому, если между строками 5 и 6 есть промежуток чисел, это означает, что мне нужно вставить 3 строки во второй листпосле 5-й строки я перестраиваю индекс, чтобы проверить дальнейшие изменения ... Он также работает, если было удалено несколько строк.

Этот способ работал нормально, пока я не понял, что пользователи могут дублировать строки илископируйте / вставьте полную строку, а затем измените данные с новой информацией, НО индекс также копируется, и когда я проверяю разницу, чтобы проверить, была ли удалена какая-либо строка, происходит сбой.

Первая попытка:

  if (event.changeType == 'INSERT_ROW' && tab =='Hoja 1') {
    for (var i = 0 ; i < indexes.length ; i++) {
      if (indexes[i] =='') {
        destSheet.insertRowAfter(i+1);
      }
    }
  }
  if (event.changeType == 'REMOVE_ROW' && tab =='Hoja 1') {
    for (var i = 0 ; i < indexes.length ; i++) {
      if (indexes[i]-indexes[i+1] < -1 && indexes[i] != 0) {
        if (indexes[i] != lastRow) {
          destSheet.deleteRows(i+3,(indexes[i]-indexes[i+1])*-1-1)
        }
      }
    }
  }
  for (var j = 0; j < lastRow-1; j++) {
    indexs.getCell(j+1, 1).setValue(j+1);
  }
}

Вторая попытка:

function checkLines (sheet, destSheet)  {
  for (var i = 0 ; i < indexes.length ; i++) {
    if (indexes[i] =='') {
      destSheet.insertRowAfter(i+1);
    }
    if (indexes[i]-indexes[i+1] < -1 && indexes[i] != 0) {
      if (indexes[i] != lastRow) {
        destSheet.deleteRows(i+3,(indexes[i]-indexes[i+1])*-1-1)
      }
    }
  }
}

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

В некоторых случаях пункт назначения не актуализируется, а затем информация, записанная в следующем столбце, не совпадает с информацией файлапервые столбцы.

Вот ссылка на пример исходного листа: https://docs.google.com/spreadsheets/d/19OnwKIEm2OFymjsjqeoQYWcA9BNAJTM0ap2rdpQlZoQ/edit?usp=sharing

А вот пункт назначения: https://docs.google.com/spreadsheets/d/10vbMIqQE1miNfuJXQ1f_MSJnVs9MJrAOcg5_ZrAPWP8/edit?usp=sharing

Буду признателен за любое предложение... И, пожалуйста, дайте мне знать, если вам нужны дальнейшие объяснения ... английский не мой родной язык, и я не уверен, что вы понимаете мою проблему.

Большое спасибо.

V.

Ответы [ 2 ]

0 голосов
/ 29 марта 2019

Активный диапазон 1 содержит количество вставленных строк.

Отрывок:

function onChange(e){
  if (e.changeType === 'INSERT_ROW'){
    const rng = SpreadsheetApp.getActiveRange();
    const row = rng.getRow();//Row where insert row is done
    const lrow = rng.getLastRow();//Last row in the newly active range
    const numRows = 1+lrow-row;//number of rows inserted
  }
}

Также обратите внимание на добавление метаданных разработчика 2 в строки, чтобы при их перемещении вы могли распознать его.

Я хотел бы иметь копию выбранных столбцов исходного листа на листе назначения, и если первый изменит свои строки, то же самое должно произойти во втором.

Самый простой способ - просто получить все данные и вставить их в лист назначения (getValues и setValues).

0 голосов
/ 29 марта 2019

Вы можете использовать что-то вроде этого:

function initRows() {//run once before first use
  var lastrow=SpreadsheetApp.getActiveSheet().getLastRow();
  PropertiesService.getScriptProperties().setProperty('ROWS',lastrow);
  return lastrow;
}

function getRows() {
  return PropertiesService.getScriptProperties().getProperty('ROWS');
}

function setRows(value) {
  PropertiesService.getScriptProperties().setProperty('ROWS',value);
}

function detectRowChange(e) {//attach to onChange installable trigger
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getActiveSheet();
  var number=Math.abs(getRows()-sh.getLastRow());
  var html=Utilities.formatString('Change Type: %s Number: %s', e.changeType,number);
  var ui=HtmlService.createHtmlOutput(html);
  SpreadsheetApp.getUi().showModelessDialog(ui, 'Change');
  setRows(sh.getLastRow());
}

Это использует диалог, чтобы определить тип изменения и количество произведенных строк.Возможно, вы захотите настроить его для ваших конкретных потребностей.Не забудьте запустить initRows () перед настройкой триггера.

PropertiesService

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