Kịch bản sau đây di chuyển các hàng liên tiếp được chọn theo một trong bốn cách được mô tả trong câu hỏi. Nó được kích hoạt bởi các mục menu tùy chỉnh (Tùy chỉnh> Di chuyển hàng ...) được tạo bởi onOpen
chức năng bất cứ khi nào bảng tính được mở. Thật không may, không có cách nào để gán phím tắt cho các chức năng của tập lệnh.
Cấu trúc của các hàm rất đơn giản: chèn các hàng, sao chép phạm vi (bao gồm các công thức và định dạng), xóa bản sao cũ của phạm vi. Hàm trợ giúp getData
loại bỏ sự cần thiết phải lặp lại việc thu thập dữ liệu giống nhau trong mỗi bốn chức năng.
function onOpen() {
var menu = [{name: "Move rows up", functionName: "moveUp"}, {name: "Move rows down", functionName: "moveDown"}, {name: "Move rows to top", functionName: "moveTop"}, {name: "Move rows to bottom", functionName: "moveBottom"}];
SpreadsheetApp.getActiveSpreadsheet().addMenu("Custom", menu);
}
function moveDown(){
var d = getData();
d.sheet.insertRowsAfter(d.row+d.height, d.height);
d.selection.copyTo(d.sheet.getRange(d.row+d.height+1, 1, d.height, d.width));
d.sheet.deleteRows(d.row, d.height);
}
function moveBottom(){
var d = getData();
d.sheet.insertRowsAfter(d.last, d.height);
d.selection.copyTo(d.sheet.getRange(d.last+1, 1, d.height, d.width));
d.sheet.deleteRows(d.row, d.height);
}
function moveUp(){
var d = getData();
d.sheet.insertRowsBefore(d.row-1, d.height);
d.sheet.getRange(d.row+d.height, 1, d.height, d.width).copyTo(d.sheet.getRange(d.row-1, 1, d.height, d.width));
d.sheet.deleteRows(d.row+d.height, d.height);
}
function moveTop(){
var d = getData();
d.sheet.insertRowsBefore(1, d.height);
d.sheet.getRange(d.row+d.height, 1, d.height, d.width).copyTo(d.sheet.getRange(1, 1, d.height, d.width));
d.sheet.deleteRows(d.row+d.height, d.height);
}
function getData() {
var d = {};
d.sheet = SpreadsheetApp.getActiveSheet();
d.selection = d.sheet.getActiveRange();
d.row = d.selection.getRowIndex();
d.height = d.selection.getHeight();
d.width = d.selection.getWidth();
d.last = d.sheet.getLastRow();
return d;
}