私はGoogleスプレッドシートをデータベースとして使っています。
普段データを保存しているスプレッドシートから特定のデータのみを公開したいと思い(スプレッドシート全体は公開したくない)、対象のデータのみを公開用の別のスプレッドシートにコピーすることにしました。
この記事ではGAS(Google App Script)を使って特定のキーワードを含む行のみを別のスプレッドシートにコピーする方法(定期的に自動実行)について記載しています。
GASでフィルタをかけたいという場合にも使える方法です。
内容と結果
データを保存しているスプレッドシート(左:OriginalDB)から、別のスプレッドシート(右:CopyDB)へ内容をコピーします。
コピーするのは、特定のキーワードを含む行のみです。
今回は例として、OriginalDBの「名前」列に「りんご」「みかん」を含む行のみをコピーする方法を説明します。
GAS(Google App Script)
実際のスプレッドシートの内容は以下です。
A列に名前が入っています。
コードを実行すると、CopyDBというスプレッドシートに以下のような実行結果が出力されます。
コードは以下です。
function CopyRows() { // 対象のスプレッドシートを指定 let originaldb = SpreadsheetApp.openById("1XwRP4IrHWcXsqaSBVUuNkW0qtwyCLntwym-5KBw308k"); //コピー元のスプレッドシートID(OriginalDB) let originaldb_sheet = originaldb.getSheetByName("db"); //コピー元ののシート名(db) let copydb = SpreadsheetApp.openById("1_m0s96RtYfz2gJCjAoIzG8oBLEr6oGwOi0Cj4_1hPpc"); //コピー先のスプレッドシートID(CopyDB) let copydb_sheet = copydb.getSheetByName("copydb"); //コピー元ののシート名(copydb) // 対象のキーワードがある列のみコピーする let data = originaldb_sheet.getDataRange().getValues(); //コピー元のスプレッドシート(OriginalDB)の全ての値を配列に格納 let keyword_list = ["りんご", "すだち"]; //コピーする対象のキーワード let paste_list = []; //コピーするキーワードを含む列のデータ格納用配列 paste_list.push(data[0]); //ヘッダーを配列に格納する for (let i = 0; i < keyword_list.length ; i++){ for (let j = 1; j < data.length ; j++){ let keyword = data[j][0]; //キーワードは0列(A列)に含まれている if(keyword === keyword_list[i]){ //対象のキーワードの列の場合のみ、配列に格納する paste_list.push(data[j]); } } } copydb_sheet.clear(); //コピー先のスプレッドシートのデータを全て削除しておく copydb_sheet.getRange(1, 1, paste_list.length, paste_list[0].length).setValues(paste_list); //対象のキーワードのデータが入った配列をスプレッドシート(CopyDB)に貼り付ける
}
コードの詳細
let originaldb = SpreadsheetApp.openById("1XwRP4IrHWcXsqaSBVUuNkW0qtwyCLntwym-5KBw308k"); //コピー元のスプレッドシートID(OriginalDB)
let originaldb_sheet = originaldb.getSheetByName("db"); //コピー元ののシート名(db)
let copydb = SpreadsheetApp.openById("1_m0s96RtYfz2gJCjAoIzG8oBLEr6oGwOi0Cj4_1hPpc"); //コピー先のスプレッドシートID(CopyDB)
let copydb_sheet = copydb.getSheetByName("copydb"); //コピー元ののシート名(copydb)
スプレッドシートのIDはURLの以下の部分(黄色)です。
シート名は、OriginalDBは「db」、CopyDBは「copydb」と名前を付けています。
スプレッドシートの値が入っている全てのセルの値を、配列に格納します。
let data = originaldb_sheet.getDataRange().getValues(); //コピー元のスプレッドシート(OriginalDB)の全ての値を配列に格納
CopyDBにコピーしたい行を、コピー用の配列に格納します。
都度、OriginalDBから抽出した行をCopyDBに貼り付けると実行速度がかなり遅くなってしまうので、一度コピーしたい行を配列に格納しておいて、最後に一気にCopyDBに貼り付けます。
まずは見出しを配列に格納しておき、そのあとで対象のキーワードを含む行のみ、配列に格納していきます。
let paste_list = []; //コピーするキーワードを含む列のデータ格納用配列 paste_list.push(data[0]); //ヘッダーを配列に格納する for (let i = 0; i < keyword_list.length ; i++){ for (let j = 1; j < data.length ; j++){ let keyword = data[j][0]; //キーワードは0列(A列)に含まれている if(keyword === keyword_list[i]){ //対象のキーワードの列の場合のみ、配列に格納する paste_list.push(data[j]); } } }
コピーしたい列が入った配列が準備できたら、最後に配列をCopyDBに貼り付けます。
貼り付ける前にCopyDBのデータを全て削除してから、データを貼り付けます。
copydb_sheet.clear(); //コピー先のスプレッドシートのデータを全て削除しておく
copydb_sheet.getRange(1, 1, paste_list.length, paste_list[0].length).setValues(paste_list); //対象のキーワードのデータが入った配列をスプレッドシート(CopyDB)に貼り付ける
定期自動実行
上記のコードを定期的に自動実行します。
GASのエディタの左にあるメニューからトリガーをクリックします。
ページ右下にある「トリガーを追加」をクリックします。
毎日、午前3時~4時に実行する場合は下記の用に設定し、保存をクリックします。
これで定期実行の設定が完了しました。
【おまけ】スプレッドシートのバックアップは簡単
スプレッドシートのバックアップを自動で取るのはとても簡単です。
下記のコードを準備し、上記の定期実行と同じ方法で設定すればバックアップが自動で取れます。
バックアップを保存するフォルダのIDはスプレッドシートのIDと同じようにURLの中に含まれています。
function Backup() { var SpreadSheet = DriveApp.getFileById('バックアップを取りたいスプレッドシートのID'); // バックアップを取るスプレッドシート var folder = DriveApp.getFolderById('バックアップを保存するフォルダのID'); // バックアップを保存するフォルダ SpreadSheet .makeCopy(SpreadSheet .getName() + '-' + Utilities.formatDate(new Date(), 'JST', 'yyyy-MM-dd'), folder);
}