スプレッドシートのチェックボックスで選択したデータを別シートに移動【GASで効率化】

Googleスプレッドシートのチェックボックスを使ったデータ管理をしていて、「チェック済みの行だけを別シートへカンタンに移動できたら便利なのに……」と思ったことはありませんか?
手作業での移動は時間がかかりますし、繰り返し作業となると面倒でもあります。
そこで今回は、Google Apps Script(GAS)を使って、チェックボックスが✅済みになった行を別のシートに移動する方法を紹介します。
このスクリプトを使えば、データの整理が効率化され、作業の手間を削減できます!

完成イメージ
移動前

移動先のシート

スクリプトを実行すると✅を入れた行だけが別のシートに移動
手順

対象のスプレッドシートを開きます。
今回の例では、A列にチェックボックスを挿入します。
1行目はヘッダーとするため、2行目以降のデータが移動対象となります。
チェックボックスの作成方法

チェックボックスを作成する範囲を選択します。
上部メニューの「挿入」から「チェックボックス」をクリックすると作成されます。

移動させたい行のチェックボックスに✅を入れます。
(サンプルの画像は条件付き書式で対象範囲に緑で色付けをしています。)

Googleスプレッドシートを開き、メニューの「拡張機能」から「Apps Script」をクリックしてGASエディタを開きます。

function myFunction(){
}
が最初から入っているため、消去して以下のスクリプトを貼り付けます。
function moveCheckedRows() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("シート名を入力"); // 元のシート
var targetSheet = ss.getSheetByName("完了"); // 移動先のシート
if (!sheet) {
Logger.log("元のシートが見つかりません。");
return;
}
// 完了シートが存在しない場合は作成し、ヘッダーをコピー
if (!targetSheet) {
targetSheet = ss.insertSheet("完了");
var header = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues();
targetSheet.getRange(1, 1, 1, header[0].length).setValues(header);
}
var lastRow = sheet.getLastRow();
if (lastRow < 2) return; // データがない場合は終了
var dataRange = sheet.getRange(2, 1, lastRow - 1, sheet.getLastColumn()); // ヘッダーを除く
var data = dataRange.getValues();
var formats = dataRange.getBackgrounds(); // セルの背景色
var fontColors = dataRange.getFontColors(); // 文字色
var checkboxes = sheet.getRange(2, 1, lastRow - 1, 1).getValues(); // A列のチェックボックス値のみ取得
var rowsToMove = [];
var formatToMove = [];
var fontColorToMove = [];
var checkboxToMove = [];
var deleteIndexes = [];
for (var i = 0; i < data.length; i++) { // **順番を維持するため、昇順でループ**
if (data[i][0] === true) { // A列のチェックボックスがTRUEか
rowsToMove.push(data[i]);
formatToMove.push(formats[i]);
fontColorToMove.push(fontColors[i]);
checkboxToMove.push([checkboxes[i][0]]); // A列のみ格納
deleteIndexes.unshift(i + 2); // **削除時の行ズレを防ぐため逆順で格納**
}
}
if (rowsToMove.length > 0) {
var targetLastRow = targetSheet.getLastRow();
var insertRow = targetLastRow >= 1 ? targetLastRow + 1 : 2; // 2行目からデータを挿入
var targetRange = targetSheet.getRange(insertRow, 1, rowsToMove.length, rowsToMove[0].length);
targetRange.setValues(rowsToMove);
targetRange.setBackgrounds(formatToMove); // 書式(背景色)を適用
targetRange.setFontColors(fontColorToMove); // 文字色を適用
var checkboxRange = targetSheet.getRange(insertRow, 1, rowsToMove.length, 1);
var rule = SpreadsheetApp.newDataValidation().requireCheckbox().build();
checkboxRange.setDataValidation(rule);
checkboxRange.setFontColor(null); // **チェックマークの色をリセット**
deleteIndexes.forEach(index => sheet.deleteRow(index)); // **削除は逆順で行う**
}
}
スクリプトの説明
- 元のシート・移動先のシートを取得
-
function moveCheckedRows() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheet = ss.getSheetByName("シート名を入力"); // 元のシート var targetSheet = ss.getSheetByName("完了"); // 移動先のシート
- スプレッドシートを取得し、
元のシート
と完了シート
を取得します。 元のシート
には対象のシート名を入力します。完了
シートが存在しない場合は自動的に後で作成されます。
- スプレッドシートを取得し、
- シートが存在しない場合のチェック
-
if (!sheet) { Logger.log("元のシートが見つかりません。"); return; }
元のシート
が見つからない場合は処理を終了します。
- 完了シートの作成とヘッダーのコピー
-
// 完了シートが存在しない場合は作成し、ヘッダーをコピー if (!targetSheet) { targetSheet = ss.insertSheet("完了"); var header = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues(); targetSheet.getRange(1, 1, 1, header[0].length).setValues(header); }
完了
シートが 存在しない場合に作成します。- (元のシートの1行目をヘッダーとしてコピーします)
- データがない場合は終了
-
var lastRow = sheet.getLastRow(); if (lastRow < 2) return; // データがない場合は終了
- データがない場合はスクリプトを終了します。
- 移動対象のデータ取得
-
var dataRange = sheet.getRange(2, 1, lastRow - 1, sheet.getLastColumn()); // ヘッダーを除く var data = dataRange.getValues(); var formats = dataRange.getBackgrounds(); // セルの背景色 var fontColors = dataRange.getFontColors(); // 文字色 var checkboxes = sheet.getRange(2, 1, lastRow - 1, 1).getValues(); // A列のチェックボックス値のみ取得
- A列のチェックボックスの値を取得します
- セルの背景色・フォント色を取得します。(移動後も同じデザインを維持するため)
- 移動する行のリスト作成
-
var rowsToMove = []; var formatToMove = []; var fontColorToMove = []; var checkboxToMove = []; var deleteIndexes = []; for (var i = 0; i < data.length; i++) { // **順番を維持するため、昇順でループ** if (data[i][0] === true) { // A列のチェックボックスがTRUEか rowsToMove.push(data[i]); formatToMove.push(formats[i]); fontColorToMove.push(fontColors[i]); checkboxToMove.push([checkboxes[i][0]]); // A列のみ格納 deleteIndexes.unshift(i + 2); // **削除時の行ズレを防ぐため逆順で格納** } }
- A列にチェックが入っている行を抽出し、配列に格納します。
- 行の順番を維持します。
- 削除時の行ズレを防ぐため、削除する行のインデックスを逆順で保存します。
- 完了シートへデータを追加
-
if (rowsToMove.length > 0) { var targetLastRow = targetSheet.getLastRow(); var insertRow = targetLastRow >= 1 ? targetLastRow + 1 : 2; // 2行目からデータを挿入 var targetRange = targetSheet.getRange(insertRow, 1, rowsToMove.length, rowsToMove[0].length); targetRange.setValues(rowsToMove); targetRange.setBackgrounds(formatToMove); // 書式(背景色)を適用 targetRange.setFontColors(fontColorToMove); // 文字色を適用
- 完了シートの最終行を取得し、2行目以降にデータを追加します・
- データの順番や背景色・フォント色を元のシートと同じように適用します。
- 元のシートから移動済みの行を削除
-
deleteIndexes.forEach(index => sheet.deleteRow(index)); // **削除は逆順で行う** }
- 元のシートから移動済みの行を削除します。
- 逆順で削除することで行ズレを防ぎます。
function moveCheckedRows() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("シート1"); // 元のシート
スクリプトの"シート名を入力"
の部分を変更します。
例:”シート1”
"タスク管理"
var targetSheet = ss.getSheetByName("完了"); // 移動先のシート
移動先のシート名は「完了」としていますが、必要に応じてシート名を変更します。

スクリプトを書いたら、名前を付けて保存します。
(例:「チェック済み行移動」)

✅済みの行が完了シートの2行目以降に移動します。

移動元のシートにあった✅済みのデータはなくなります。
GASの実行をカンタンにする方法
スクリプトをスプレッドシート上で素早く実行できるようにするには、次のような方法があります。
図形ボタンを設置して実行

これで、ボタンをクリックするだけでスクリプトが実行されます。
マクロを活用してショートカットキーで実行

(例:Ctrl + Alt + 1
)
これで、ショートカットキーを押すだけでスクリプトを実行できます。
図形ボタンの設置方法やマクロの詳細な設定方法については、こちらの記事で紹介しています。

まとめ
今回のGASでは、チェックボックスが✅済みになった行を「完了」シートに自動で移動し、元のシートから削除することができます。
繰り返し作業の場合はGASを活用することで、手作業の負担を減らして業務の効率化が可能です。
ひんぱんに行移動させる作業がある場合に、今回のスクリプトをご活用ください。
弊社では、Google Apps Script(GAS)を活用した業務効率化のサポートを提供しております。
GASのカスタマイズやエラー対応にお困りの際は、ぜひお気軽にご相談ください。
また、ITツールの導入支援やIT導入補助金の申請サポートも行っております。
貴方の業務改善を全力でサポートいたします。
コメント