カスタムのGoogleスプレッドシートのショートカット:選択した行を上/下/上/最後に移動


8

タイトルが言うように、私は行をたくさん移動します、そしてデフォルトのショートカットの欠如は私にとって事を複雑にします...

巨大なシートの下部にいくつかの行を移動する必要がある場合、ドラッグオプションは実用的ではありません。

AutoHotKeyを試してみましたが、一度に1行ずつ移動し、最下部まで到達するのに時間がかかるので、面倒です。

だから私は多分JavaScriptのソリューションを探しています、誰かが私が必要に応じて後で編集/拡張できる基本のサンプルコード/参照を使って私を正しい道に置くことができるなら...

また、私が考えていない別の解決策も歓迎します。

編集: タイトルから:

  • 上へ:行を1行上に移動します
  • 下:行を1行下に移動します
  • 上:行をシートの最上部に移動します(完全に上)
  • End:行をシートの一番下に移動します(空ではない行の最後にずっと下に移動します)

行は連続して移動されますか?また、タイトルには「上/下/上/終わり」と記載されていますが、投稿では下への移動についてのみ記述しています。「トップ」の意味は推測できますが、アップ/ダウンについてはわかりません

@ノーマ:いくつかの説明を追加しました。行については、簡単にするために連続した行であるとしましょう(行がなくても、移動する前にグループ化するのは複雑ではありません)
Enissay

回答:


5

次のスクリプトは、質問で説明されている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;
}

あなたの魔法のコードは魅力のように機能します。ただし、次のことを実現する方法があるかどうか疑問に思っていました。1.移動した行は移動後もフォーカス(選択)されているはずですが、現在はそうではありません。 2.行を移動するときに、ウィンドウを下または上にスクロールして行を追うと便利です。主な質問には回答しましたが、これらを追加して完璧にすることは素晴らしいことです(多くの人が便利だと確信しています)
Enissay

承認済みとしてマークされ、必要に応じて後で追加のポイントを追加できます:-)
Enissay
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.