次のスクリプトは、質問で説明されている4つの方法のいずれかで、選択された連続行を移動します。これはonOpen
、スプレッドシートが開かれるたびに関数によって作成されるカスタムメニュー項目([カスタム]> [行の移動...])によってトリガーされます。残念ながら、スクリプトの機能にキーボードショートカットを割り当てる方法はありません。
関数の構造は単純です。行の挿入、範囲のコピー(数式と書式設定を含む)、範囲の古いコピーの削除です。ヘルパー関数getData
により、4つの関数のそれぞれで同じデータ収集を繰り返す必要がなくなります。
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;
}