自动根据其中1张纸对2张纸进行分类

时间:2018-11-22 16:13:32

标签: sorting google-apps-script google-sheets

我正在运行一个包含多个工作表的电子表格,在Sheet3中,我正在输入一些数据并运行一个自动排序代码,该代码将按D列升序对其进行排序。

Sheet3 Example | Sheet1 Example

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并执行自动排序时,我希望Sheet1中从D到F的行能够与Sheet3的重新定位一起进行。我希望我确实能够正确解释我想要的东西。

我尝试使它起作用没有成功。我不知道执行此操作的正确方法,尤其是由于Sheet1表的范围不同。

1 个答案:

答案 0 :(得分:0)

我想出了解决问题的方法,因此我将在此处发布代码。基本上,每当您在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 });
  } 
}