0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【GAS】スプレッドシートを別ファイルへ同期(ミラーリング)する方法

0
Posted at

作ったきっかけ

Google Apps Script(GAS)を使って「特定シートの内容を別のスプレッドシートにリアルタイム同期(ミラーリング)」したいケースはよくあります。

しかし、ソースコード内にスプレッドシートのIDを直接書き込む(ハードコードする)と、以下のようなリスクや課題が生じます

  • セキュリティリスク: コードをGitHub等に公開した際、機密なスプレッドシートのIDが漏洩する。
  • 保守性の低下: コピー先のスプレッドシートを変更・再作成するたびにコードを直接編集する必要がある。

本記事では、**スクリプトプロパティ(環境変数のような機能)**を活用し、スプレッドシートIDをコード上に露出させずに安全にシートを同期(コピー)するGASコードとその実装手順を解説します。


💡 解決のポイント:スクリプトプロパティを使う

GASにはスクリプトプロパティPropertiesService.getScriptProperties())という機能があり、キー&バリュー形式で設定値を保存できます。

コードにはプロパティ名(例: DEST_SPREADSHEET_ID)だけを記述しておき、実際のIDはGASのエディタ画面で設定することで、コードの安全性を保ちながら柔軟に設定変更が可能になります。


📝 改善後のGASコード

以下が、スプレッドシートIDを隠蔽(プロパティ化)した完全版のGASコードです。

/**
 * スプレッドシート同期(ミラーリング)スクリプト
 * 
 * 設定手順:
 * 1. GASエディタの「プロジェクトの設定(歯車アイコン)」を開く
 * 2. 「スクリプト プロパティ」に以下を追加する:
 *    - プロパティ名: DEST_SPREADSHEET_ID
 *    - 値: コピー先スプレッドシートのID (URLの /d/ と /edit の間の文字列)
 */

// 定数定義(シート名などの基本設定)
const CONFIG = {
  SOURCE_SHEET_NAME: '専門家解説',            // コピー元のシート名
  DEST_SHEET_NAME: 'mirrorSheet',             // コピー先のシート名
  PROPERTY_KEY_DEST_ID: 'DEST_SPREADSHEET_ID' // スクリプトプロパティのキー名
};

/**
 * 編集イベントトリガー関数
 * シートが編集された際に自動で実行されます
 * @param {Object} e - 編集イベントオブジェクト
 */
function mirrorSheet(e) {
  // 1. 対象シート以外の編集は処理をスキップ
  if (e && e.range && e.range.getSheet().getName() !== CONFIG.SOURCE_SHEET_NAME) {
    return;
  }

  // 2. コピー元シートの取得
  const sourceSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(CONFIG.SOURCE_SHEET_NAME);
  if (!sourceSheet) {
    Logger.log('エラー: コピー元シートが見つかりません: ' + CONFIG.SOURCE_SHEET_NAME);
    return;
  }

  // 3. スクリプトプロパティからコピー先スプレッドシートIDを取得
  const scriptProperties = PropertiesService.getScriptProperties();
  const destSpreadsheetId = scriptProperties.getProperty(CONFIG.PROPERTY_KEY_DEST_ID);

  if (!destSpreadsheetId) {
    throw new Error('スクリプトプロパティ [' + CONFIG.PROPERTY_KEY_DEST_ID + '] が設定されていません。プロジェクトの設定から追加してください。');
  }

  // 4. コピー先シートの取得
  let destSheet;
  try {
    destSheet = SpreadsheetApp.openById(destSpreadsheetId).getSheetByName(CONFIG.DEST_SHEET_NAME);
  } catch (err) {
    throw new Error('コピー先スプレッドシートを開けませんでした。IDが正しいか確認してください。 (ID: ' + destSpreadsheetId + ')');
  }

  if (!destSheet) {
    throw new Error('コピー先シートが見つかりません: ' + CONFIG.DEST_SHEET_NAME);
  }

  // 5. データの同期処理(クリア & 一括書込)
  const values = sourceSheet.getDataRange().getValues();
  
  // コピー先の既存の値をクリア(値のみ)
  destSheet.clearContents();

  // データが存在する場合のみ書き込み
  if (values.length > 0 && values[0].length > 0) {
    destSheet.getRange(1, 1, values.length, values[0].length).setValues(values);
  }

  Logger.log('同期完了: ' + new Date().toLocaleString());
}

まとめ

GASでスプレッドシートIDやAPIキーなどの機密情報を扱う際は、「スクリプトプロパティ」を活用するのが鉄則です。
この工夫をするだけで、セキュリティが大幅に向上し、コードの使いまわし(再利用)も格段にしやすくなります。ぜひ試してみてください!
この記事が役に立ちましたら、ぜひ「LGTM(いいね)」やブックマークをよろしくお願いします!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?