作ったきっかけ
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(いいね)」やブックマークをよろしくお願いします!