• Как запустить триггер при редактировании определенной ячейки, определенного листа?

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    Вероятно, вот так должно сработать

    /**
     * @param {GoogleAppsScript.Events.SheetsOnEdit} e
     */
    function onEdit(e) {
      if (
        e.range.getSheet().getName() === 'Sheet1' &&
        e.range.getA1Notation() === 'M2'
      )
        CopyList();
    }
    
    /**
     *
     */
    function CopyList() {
      var sss = SpreadsheetApp.openById('ID-ТАБЛИЦЫ1');
      var ss = sss.getSheetByName('Sheet1');
    
      var from = ss;
      var fromValues = from.getDataRange().getValues();
      var fromData = fromValues;
    
      var tss = SpreadsheetApp.openById('ID-ТАБЛИЦЫ2');
      var ts = tss.getSheetByName('Sheet2');
    
      ts.getRange(
        ts.getLastRow() + 1,
        1,
        fromData.length,
        fromData[0].length
      ).setValues(fromData);
    }
    Ответ написан
    Комментировать
  • Скопировать данные из одного листа таблицы в другую таблицу на лист в последнюю не заполненную строку?

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    К сожалению, скорее всего точный ответ с решением на такой вопрос выходит за рамки публичной поддержки. Но никто не отменяет теорию.

    В данном случае необходимо создать два скрипта:
    1. Скрип клиента. Он так и будет отправлятьинформацию, которую вы получаете в onEdit
    2. Скрипт-сервер. Он должен получать данные от клиента и запускать функцию userActionsCopyToLogs уже у себя.


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

    В любом случае, копайте в сторону Google Apps Script Web Apps. Это должно помочь. Никакого лишенего кода, кроме отправки запроса на сервер и получения данных на сервере вам не нужно. Все остальное уже есть.

    С уважением.
    Ответ написан
  • Скопировать данные из одного листа на другой последнюю не заполненную строку?

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    Я бы сделал так

    /**
     *
     */
    function onOpen() {
      SpreadsheetApp.getUi()
        .createMenu('Custom menu')
        .addItem('Copy to logs', 'userActionsCopyToLogs')
        .addToUi();
    }
    
    /**
     *
     */
    function userActionsCopyToLogs() {
      var headers = ['Name', 'Number'];
    
      var from = SpreadsheetApp.getActiveSheet();
    
      if (from.getName() !== 'Sheet1') {
        SpreadsheetApp.getActive().toast('Activate a range on "Sheet1"');
        return;
      }
    
      var fromValues = from.getDataRange().getValues();
    
      var fromHeaders = fromValues[0].map(function(h) {
        return headers.indexOf(h);
      });
    
      var activeRange = SpreadsheetApp.getActiveRange();
      var rowStart = activeRange.getRow();
      var rowEnd = activeRange.getLastRow();
      var fromData = fromValues
        .filter(function(row, i) {
          return i >= rowStart - 1 && i <= rowEnd - 1;
        })
        .map(function(row) {
          return row.filter(function(_, j) {
            return fromHeaders[j] > -1;
          });
        });
    
      var to =
        SpreadsheetApp.getActive().getSheetByName('Logs') ||
        SpreadsheetApp.getActive().insertSheet('Logs');
    
      to.getRange(to.getLastRow() + 1, 1, fromData.length, fromData[0].length)
        .setValues(fromData)
        .activate();
    }


    screenrecord.gif

    Измените строку var headers = ['Name', 'Number']; так, чтобы копировались данные из нужных вам колонок.

    Полный код
    Ответ написан
    Комментировать