QED

私はこの世界について驚くべき真理を発見した。だが、それを記すにはこのブログは狭すぎる。

Google Apps ScriptでGoogleドキュメントを部分的に同期する方法

Googleドキュメントを使って、スプレッドシートを共有している人は多いかと思います。ところがスプレッドシートの一部分だけを共有することは通常できません。

 

そこで今回は、Google Apps Script(GAS)を使ってスプレッドシートの一部分だけを共有する方法を紹介します。

 

 

用意するのは2つのスプレッドシートです。

1つは共有用のファイル(「共有ファイル」と呼びます)このファイルを他の人と共有します。

もう1つは各人固有の「本ファイル」です。

 

 

まず本ファイルを開きます。

「ツール」→「スクリプトエディタ」を選択して、Google Apps Scriptのスクリプトエディタを開きます。

 

そして次のコードを入力して保存してください。

 

 


var spreadID = '0ArZiDoplqPi_dElDd3V5WEJiM2JoU3praUk4TEx5UEE';

var sheetName = 'シート1';

 

function copyValuesFrom() {

  try {

  

  var ss_copyFrom = SpreadsheetApp.openById(spreadID);

  var ss_copyTo = SpreadsheetApp.getActiveSpreadsheet();

  var sheet_copyFrom = ss_copyFrom.getSheetByName(sheetName);

  var sheet_copyTo = ss_copyTo.getActiveSheet();

  

  var copyValue = sheet_copyFrom.getRange('A2:B6').getValues();

  sheet_copyTo.getRange('C2:D6').setValues(copyValue);

 

  SpreadsheetApp.getActiveSpreadsheet().toast('共有部分を同期しました。');

 

  }catch(e){

    Browser.msgBox(e);

  }

}

 

function copyValuesTo() {

  try {

    

  var ss_copyFrom = SpreadsheetApp.getActiveSpreadsheet();

  var ss_copyTo = SpreadsheetApp.openById(spreadID);

  var sheet_copyFrom = ss_copyFrom.getActiveSheet();

  var sheet_copyTo = ss_copyTo.getSheetByName(sheetName);

    

  var copyValue = sheet_copyFrom.getRange('C2:D6').getValues();

  sheet_copyTo.getRange('A2:B6').setValues(copyValue);

 

  SpreadsheetApp.getActiveSpreadsheet().toast('更新を共有部分に保存しました。');

    

  }catch(e){

    Browser.msgBox(e);

  }  

}

 

function myOnOpen() {

  copyValuesFrom();

  

  var ss = SpreadsheetApp.getActiveSpreadsheet();

  var menus = [{name: 'リフレッシュ', functionName: 'copyValuesFrom'},

               {name: '更新を今すぐ保存する', functionName: 'copyValuesTo'},

              ];

  ss.addMenu('同期メニュー', menus);

 

}


 

このうち、色がついている部分を編集する必要があります。

 

spreadIDには、共有ファイルのIDを入れます。

https://docs.google.com/spreadsheet/ccc?key=****************#gid=0 の「****************」の部分です。

 

sheetNameは、共有ファイルのシート名です。

 

 

copyValuesFrom()関数は、共有ファイルの情報を本ファイルに同期します。

 

var copyValue = sheet_copyFrom.getRange('A2:B6').getValues();

で、共有ファイルの中から同期したいセルの範囲を指定しています。

 

sheet_copyTo.getRange('C2:D6').setValues(copyValue);

が、本ファイルでの同期先セル範囲です。

 

 

同様にして、copyValuesTo()関数では、本ファイルで編集した情報を共有ファイルに保存します。この関数では、

 

var copyValue = sheet_copyFrom.getRange('C2:D6').getValues();

で、本ファイルでのセル範囲を指定し、

 

sheet_copyTo.getRange('A2:B6').setValues(copyValue);

で、共有ファイルでのセル範囲を指定しています。

 

 

これらの情報を編集した上で、スクリプトエディタの「リソース」→「現在のプロジェクトのトリガー」から

 

実行イベント
myOnOpen スプレッドシートから 起動時
copyValuesTo 時間主導型 分タイマー 1分ごと
copyValuesFrom 時間主導型 分タイマー 1分ごと

 

と設定することで(画像参照)本ファイルを開いたときと1分ごとに情報を同期します。

 

f:id:qed1:20130206215501j:plain

 

また本ファイルに「同期メニュー」というメニューが追加されています。

「リフレッシュ」を選択すると、共有ファイルからの情報を本ファイルに同期します。

「更新を今すぐ保存する」を選択すると、本ファイルに編集した情報を共有ファイルに保存します。