Автосортировка 2 листов на основе 1 из них - PullRequest
0 голосов
/ 22 ноября 2018

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

Пример листа 3 | Пример Sheet1

«Имя» и «местоположение» в Sheet1 импортируются из Sheet3, поэтому они меняются местами, когда Sheet3 выполняет сортировку, однако проблема в том, что информация от D до F(Sheet1) не поменяется местами и будет отображаться для неправильных людей.

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

/*
 * @author Mike Branski (@mikebranski)
 * @link https://gist.github.com/mikebranski/285b60aa5ec3da8638e5
 */

var SORT_COLUMN_INDEX = 4;
var ASCENDING = true;
var NUMBER_OF_HEADER_ROWS = 2;
var SHEET_NAME = 'Sheet3';
var activeSheet;

function autoSort(sheet) {
  var s = SpreadsheetApp.getActiveSheet();
  if (s.getName() == SHEET_NAME) {
    var range = sheet.getDataRange();
    if (NUMBER_OF_HEADER_ROWS > 0) {
      range = range.offset(NUMBER_OF_HEADER_ROWS, 0, (range.getNumRows() - NUMBER_OF_HEADER_ROWS));
    }

    range.sort( {
      column: SORT_COLUMN_INDEX,
      ascending: ASCENDING
    } );
  }
}

function onEdit(event) {
  var s = SpreadsheetApp.getActiveSheet();
  if (s.getName() == SHEET_NAME) {
    var editedCell;
    activeSheet = SpreadsheetApp.getActiveSheet(); 
    editedCell = activeSheet.getActiveCell(); 
    if (editedCell.getColumn() == SORT_COLUMN_INDEX) {
      autoSort(activeSheet);
    }
  }
}

function onOpen(event) {
  var s = SpreadsheetApp.getActiveSheet();
  if (s.getName() == SHEET_NAME) {
    activeSheet = SpreadsheetApp.getActiveSheet();
    autoSort(activeSheet);
  }
}

function onInstall(event) {
  onOpen(event);
}

Так что, в основном, когда я редактирую Sheet3 и он выполняет автоматическую сортировку, я хочу, чтобы строки от D до F в Sheet1 продолжалис перепозиционированием, которое происходит от Sheet3.Надеюсь, мне удалось правильно объяснить, чего я хочу.

Я безуспешно пытался заставить его работать;Я не могу найти правильный способ сделать это, особенно из-за того, что таблица Sheet1 имеет другой диапазон.

1 Ответ

0 голосов
/ 08 декабря 2018

Я понял, как решить проблему, поэтому выложу код здесь.По сути, всякий раз, когда вы редактируете столбец, по которому вы выбираете сортировку, в Sheet3 (основной лист), он сначала копирует в Sheet1 (целевой лист) изменения, внесенные вами в столбцы A и B, а затем сортирует оба листа одновременно.время, таким образом, данные из следующих столбцов в Sheet1 будут продолжаться.

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

// Master Sheet Settings (Copy ranges must be similar in size)
var msName = 'Master Sheet';
var msSortCol = 4;  // which column to trigger the sorting when you edit
var msSkipRows = 6; // how many rows to skip, if you have header rows
var msCopyRange = 'A7:B51'; // the range you want to copy

// Target Sheet Settings
var tsSortCol = 3;
var tsSkipRows = 10;
var tsName = 'Target Sheet'; 
var tsCopyRange = 'A11:B55';

var sortAscending = true;
var activeSheet;

function onEdit() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var editedCell = ss.getActiveRange().getColumnIndex();

  if (ss.getSheetName() == msName) {
    activeSheet = SpreadsheetApp.getActiveSheet();
  if (editedCell == msSortCol) {
    copyRow();
    autoSort(activeSheet);
    }
  } 
}

function copyRow() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName(msName);
  var values = sheet.getRange(msCopyRange).getValues();
  ss.getSheetByName(tsName).getRange(tsCopyRange).setValues(values);
  SpreadsheetApp.flush();
}

function autoSort() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var msheet = ss.getSheetByName(msName);
  var tsheet = ss.getSheetByName(tsName);
  var mrange = msheet.getDataRange();
  var trange = tsheet.getDataRange();

  if (ss.getSheetName() == msName) {
    if (msSkipRows > 0) {
      mrange = mrange.offset(msSkipRows, 0, (mrange.getNumRows() - msSkipRows));
    } 
    if (tsSkipRows > 0) {
      trange = trange.offset(tsSkipRows, 0, (trange.getNumRows() - tsSkipRows));
    }

    mrange.sort({ column: msSortCol, ascending: sortAscending });
    trange.sort({ column: tsSortCol, ascending: sortAscending });
  } 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...