Googleスプレッドシートの行列コピー操作、頻繁に行いませんか?
いままでExcelの操作に慣れてきた私にとっては、かなり頻繁に行う操作です。
ですが、残念ながら2019年5月現在の仕様だと一発で行列コピーするショートカットキーやコンテキストメニュー(右クリック操作)が存在しないんですよね。。。これが結構痛い。。。
私が認識している限り、行や列を一旦挿入してから、コピーして、その挿入行に貼り付ける、という数段階の操作になると思います。
これが結構めんどくさいんですよね。同じように考えている人は結構いるのではないでしょうか。
そこで、少しでもスムーズに行列コピーできるように、最速と思われる操作をGIFアニメにしてみました。
また、一発で行列コピーできるGASマクロを作成してみました。
もしかしたら、いずれGoogle様によって改善されるかもしれませんが(単なる願望)、それまでの繋ぎとして
行列コピー操作をめちゃくちゃ頻繁に行うので、煩わしい数段階の操作はもうイヤだ・・・
という人は試してみてください。
GASマクロは、初心者の人やExcelVBAに慣れている人からすると抵抗があるかもしれませんが、無料でいつでも始められて取っつきやすいので、ぜひお試しください。
私もGASはまだ初心者なので何か不備や間違いがあったらスミマセン。少しでも参考になれば幸いです。
Googleスプレッドシートにおける最速の行コピー・列コピー操作
マウスを極力使わずにスムーズに行えるのはたぶん以下の操作だと思います。
Googleスプレッドシートの行列コピー操作イメージ(通常)
ポイントは、マウスでいちいち右クリック操作をしない、という点ですね。
行全体を選択Shift+Space、列全体を選択Ctrl+Space、行列挿入ショートカットキーCtrl+Alt++(;)を駆使しましょう。
また、行列の挿入操作はセルを選択している場合、行列を選択している場合で若干わかりにくいので、詳細は以下を参考にしてみてください。
行列挿入操作のショートカットキーはこちら↓↓↓
現在、マウス操作がめんどくさい、もっと行列コピーの効率を上げたいと思っている方は試しに同じようにやってみてください。
GASマクロを使った一発でできる行コピー・列コピー操作
上記の段階を踏む煩わしい操作を改善できる一発操作マクロを作成してみました。
Googleスプレッドシートの行列コピー操作イメージ(GAS)
キー操作量はかなり減ると思います。超頻繁に行列コピーを行う場面がある場合は、ぜひご検討ください。
GASの処理は「選択している行列数分を新規で挿入後、コピー元の行列セルをコピー貼り付けする」という一連の操作を一括で行っているだけです。
画像上のセルは検証のために書式や幅、数式、など、いろいろなパターンで設定してます。
基本的には想定通りにコピーされるようですが、条件付き書式などはExcelとは違う動きをします。
また、Ctrl+Cを行わずに実現しますので、キー操作は減りますが、任意の行や列に貼り付けることができないという制約ありです。その場合はコピーした後、Excelではできないドラッグ機能で任意の行列に移動しましょう。
Excelの動きに近い感覚で操作は可能になりますが、意図しない結果になる可能性があることはあらかじめご了承ください。
個人的には共通ライブラリに登録して全スプレッドシートで使えるようにしたいところですが、マクロ登録作業がなかなかしんどいかもしれませんね。Google様の今後の対応を待ちましょう。
行列コピーGASマクロの主な仕様
ザックリとした仕様を箇条書きで記載します。
- ①「行のみ選択の場合は上、列のみ選択の場合は左にコピー」、②「行のみ選択の場合は下、列のみ選択の場合は右にコピー」の2パターンの処理。
- 「行のみ選択」「列のみ選択」の判断はシート全体の全行、全列を選択しているか。
- 選択行列数分を挿入し、コピーする。
- 「行のみ選択」「列のみ選択」以外はスルー。
行列コピーGASマクロのソースコード
マクロの登録方法は以下を参照いただければと思います。
目的に合っていない場合は適当にカスタマイズしてみてください。GASマクロの勉強にも少しは役立つと思います。
/* 行のみ選択の場合は上、列のみ選択の場合は左にコピー */
function selRowColCopyBefore() {
// 行列コピー処理呼び出し
selRowColCopy(1, SpreadsheetApp.CopyPasteType.PASTE_NORMAL);
}
////////////////////////////////////////////////////////////////////////////////
/* 行のみ選択の場合は下、列のみ選択の場合は右にコピー */
function selRowColCopyAfter() {
// 行列コピー処理呼び出し
selRowColCopy(2, SpreadsheetApp.CopyPasteType.PASTE_NORMAL);
}
////////////////////////////////////////////////////////////////////////////////
/* 選択行列コピー */
function selRowColCopy(befAftKbn, copyPasteType) {
var sheet = SpreadsheetApp.getActiveSheet(); // アクティブシート
var range = sheet.getActiveRange(); // 選択範囲セル
var startRow = range.getRow(); // 開始行
var startCol = range.getColumn(); // 開始列
var endRow = range.getLastRow(); // 終了行
var endCol = range.getLastColumn(); // 終了列
// シート全体の最終行(値を持つセル範囲の最終行からCtrl+↓で移動した行位置が必ずシート最終行になると判断)
//var sheetLastRow = sheet.getRange(sheet.getLastRow(), range.getColumn())
// .getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow();
var sheetLastRow = sheet.getMaxRows();
// シート全体の最終列(値を持つセル範囲の最終列からCtrl+→で移動した列位置が必ずシート最終列になると判断)
//var sheetLastCol = sheet.getRange(range.getRow(), sheet.getLastColumn())
// .getNextDataCell(SpreadsheetApp.Direction.NEXT).getColumn();
var sheetLastCol = sheet.getMaxColumns();
/********* 行列コピー処理 *********/
if (startCol == 1 && endCol == sheetLastCol) {
// 選択セル開始行が1行目、かつ、選択セル終了行がシート最終行の場合は、「行のみ選択」と判断する
var selRowCnt = endRow-startRow+1; // 選択行数
//Browser.msgBox(selRowCnt+"行選択(行:"+startRow+"-"+endRow+",列:"+startCol+"-"+endCol+")");
if (befAftKbn == 1) {
// 上行
// 選択行数分を挿入
sheet.insertRowsBefore(startRow, selRowCnt);
// 選択行数分をコピー
sheet.getRange((startRow+selRowCnt), 1, selRowCnt,sheetLastCol)
.copyTo(sheet.getActiveRange(), copyPasteType, false);
} else if (befAftKbn == 2) {
// 下行
// 選択行数分を挿入
sheet.insertRowsAfter((startRow+selRowCnt-1), selRowCnt);
// 挿入行を選択(全列)(選択行数分オフセット)
sheet.getActiveRange().offset(selRowCnt, 0, selRowCnt, range.getNumColumns()).activate();
// 選択行数分をコピー
sheet.getRange(startRow, 1, selRowCnt, sheetLastCol)
.copyTo(sheet.getActiveRange(), copyPasteType, false);
}
} else if (startRow == 1 && endRow == sheetLastRow) {
// 選択セル開始列が1列目、かつ、選択セル終了列がシート最終列の場合は、「列のみ選択」と判断する
var selColCnt = endCol-startCol+1; // 選択列数
//Browser.msgBox(selColCnt+"列選択(行:"+startRow+"-"+endRow+",列:"+startCol+"-"+endCol+")");
if (befAftKbn == 1) {
// 左列
// 左に選択列数分を挿入
sheet.insertColumnsBefore(startCol, selColCnt);
// 選択列数分をコピー
sheet.getRange(1, (startCol+selColCnt), sheetLastRow, selColCnt)
.copyTo(sheet.getActiveRange(), copyPasteType, false);
} else if (befAftKbn == 2) {
// 右列
// 右に選択列数分を挿入
sheet.insertColumnsAfter((startCol+selColCnt-1), selColCnt);
// 挿入列を選択(全行)(選択列数分オフセット)
sheet.getActiveRange().offset(0, selColCnt, range.getNumRows(), selColCnt).activate();
// 選択列数分をコピー
sheet.getRange(1, startCol, sheetLastRow, selColCnt)
.copyTo(sheet.getActiveRange(), copyPasteType, false);
}
} else {
// 「行のみ選択」「列のみ選択」以外はスルー
}
}
実行方法
上行・左列にコピーしたい場合は「selRowColCopyBefore」、下行・右列にコピーしたい場合は「selRowColCopyAfter」を実行してください。
目的に合っていない場合はカスタマイズしてみてください。
最後に
Googleスプレッドシートの使い方は人それぞれ、いろんなやり方があると思いますが、一例としてご紹介させていただきました。
GASマクロはExcelVBAとはかなり違いますが、JavaScriptは覚えておいて損はないプログラムだと思うのでショートカットキーなどと組み合わせてぜひ活用してみてください。
Googleスプレッドシート全ショートカットキー一覧はこちら↓↓↓
ちょっと工夫すれば、ちょっとした操作に1分かかっていた作業を10秒でこなすことができるようになる可能性があります。
それだけでも、積み上げれば相当の工数を削減できるはずなので、ぜひ自分に合ったやり方を模索していきましょう。
コメント