毎度おなじみ便利なGoogleスプレッドシートですが、今回は同期スクリプト?のような状態の作り方についてご紹介していきます。例えば2つのファイルの状態を同期(シート内のデータを同じ状態に)させたいと思った時には、標準にはそのような機能はどうやら見当たりませんが、GAS・GoogleAppsScriptを使って実現することが可能です。
GASのスキルアップはこちら▼
2つのデータを同期させるとは?
例えば、「Aファイル」内の「シート1」のA1を編集した時、「Bファイル」内の「シート1」のA1が同じセルの情報に変わる。逆に「Bファイル」内の「シート1」のA1を編集した時、「Aファイル」内の「シート1」のA1セルがBファイルと同じ状態に変わる、という感じです。
ファイルを2つ準備する
まずはGoogleスプレッドシートのファイルを2つ準備します。名前は何でもいいのですが、わかりやすいように「ファイルA」「ファイルB」としておきます。
[rml_read_more]
スクリプトを新規作成する
それぞれのファイルにAppsScriptを新規作成します。拡張機能>AppsScriptを選択します。
分かりやすいようにプロジェクト名を変更しておきましょう。
シートのデータを読み込む
まずは、スプレッドシートのデータにアクセスできるように下記のようにスクリプトを記述します。※IDとシート名は作ったファイルの環境に合わせて変更が必要です。
関数名も分かりやすいように変更しておきます。
const ID1 = "XXXXXXXXXXXXX"; //ファイルAのスプレッドシートID
const ID2 = "XXXXXXXXXXXXX"; //ファイルBのスプレッドシートID
const SHEET_NAME = "シート1";
function myFileSync() {
const spreadsheet1 = SpreadsheetApp.openById(ID1).getSheetByName(SHEET_NAME);
const spreadsheet2 = SpreadsheetApp.openById(ID2).getSheetByName(SHEET_NAME);
}
これだけで、コンテナバインドになっているGoogleスプレッドシートのデータにアクセスができるようになります。これをファイルA・ファイルBの双方に設定します。
ファイルAからファイルBにデータを書き込む
ファイルAからファイルBにデータを書き込んでみます。「getRange」「getValue」「setValue」を使って、A1セルの値を取得してファイルBのA1セルにセットします。この状態でスクリプトを実行してみます。
function myFileSync() {
const spreadsheet1 = SpreadsheetApp.openById(ID1).getSheetByName(SHEET_NAME);
const spreadsheet2 = SpreadsheetApp.openById(ID2).getSheetByName(SHEET_NAME);
//ファイルA→ファイルB 転記
const text1 = spreadsheet1.getRange(1,1).getValue();
spreadsheet2.getRange(1,1).setValue(text1);
}
「承認が必要です」と聞かれるので権限を確認から進んでいきます。※次の画面は過去に何度も書いているので他の記事をご参考ください。
セルA1のデータが同じ状態になる
このスクリプトの実行によって「ファイルAのA1セルからファイルBのA1セルにデータを書き込み」されたので、A1セルの中身が同じ内容になります。
トリガーを設定する
このままでは手動でスクリプトを実行した時に転記・・・になるので、トリガーを設定して自動で実行されるように仕掛けてみます。
セット完了です。
セルを編集すると自動で書き込みされるようになる
これで、ファイルAのA1セルの値を編集したタイミング(厳密には他のセルでもですが・・・)でスクリプトが動いて、セルに値が自動転記されます。
同じ内容になりました!!
B→Aのファイルにデータを書き込む
ファイルA→ファイルBの転記はこれで完了です。あとは、ファイルB→ファイルAを設定します。ここまできたら簡単ですね!先程と反対の状態を設定します。
function myFileSync() {
const spreadsheet1 = SpreadsheetApp.openById(ID1).getSheetByName(SHEET_NAME);
const spreadsheet2 = SpreadsheetApp.openById(ID2).getSheetByName(SHEET_NAME);
//ファイルB→ファイルA 転記
const text1 = spreadsheet1.getRange(1,1).getValue();
spreadsheet1.getRange(1,1).setValue(text1);
}
spreadsheet1.getRange(1,1).getValue();のspreadsheet1をspreadsheet2に書き換えます。
spreadsheet1.getRange(1,1).setValue(text1);のspreadsheet1をspreadsheet2に書き換えます。これで、セルの値を取得するスプレッドシートとセルに書き込むスプレッドシートが反対になります。
ファイルBのA1セルの値を書き換えてみます。
ファイルAのA1セルも同じ値になりました!!
これで双方向のA1セル自動転記ができるようになりました!つまり・・・「同期」のような状態になります。
完成形はこちら
ファイルA
const ID1 = "XXXXXXXXXXXXX"; //ファイルAのスプレッドシートID
const ID2 = "XXXXXXXXXXXXX"; //ファイルBのスプレッドシートID
const SHEET_NAME = "シート1";
function myFileSync() {
const spreadsheet1 = SpreadsheetApp.openById(ID1).getSheetByName(SHEET_NAME);
const spreadsheet2 = SpreadsheetApp.openById(ID2).getSheetByName(SHEET_NAME);
//ファイルA→ファイルB 転記
const text1 = spreadsheet1.getRange(1,1).getValue();
spreadsheet2.getRange(1,1).setValue(text1);
}
ファイルB
const ID1 = "XXXXXXXXXXXXX"; //ファイルAのスプレッドシートID
const ID2 = "XXXXXXXXXXXXX"; //ファイルBのスプレッドシートID
const SHEET_NAME = "シート1";
function myFileSync() {
const spreadsheet1 = SpreadsheetApp.openById(ID1).getSheetByName(SHEET_NAME);
const spreadsheet2 = SpreadsheetApp.openById(ID2).getSheetByName(SHEET_NAME);
//ファイルB→ファイルA 転記
const text1 = spreadsheet2.getRange(1,1).getValue();
spreadsheet1.getRange(1,1).setValue(text1);
}
まとめ
これで「A1セルの同期」が完成しました!ただこのままだとA1セルのデータのみが同期のような状態になるので、他のセルも同様に同期されるような設定が必要です。
この続きについては長くなりましたので、また次回ご紹介をしたいと思います。
ご参考ください。