Google Apps Script (GAS) でスプレッドシートを操作する際、「スクリプト用の設定値をどこに保存しよう?」「この行に対応するデータベースのIDをどこかに持っておきたい」と悩んだことはありませんか? セルに直接書き込むとユーザーに見えてしまうし、間違って消されるリスクもあります。
そんな時に役立つのが「開発者メタデータ (Developer Metadata)」です。
これは、スプレッドシートの裏側に、スクリプト専用の「隠し情報」を安全に埋め込むための機能です。この記事では、getDeveloperMetadata() メソッドを中心に、メタデータの基本からセキュリティ、パフォーマンスまでを徹底解説します。

開発者メタデータとは?シートの裏側に貼る付箋
開発者メタデータは、スプレッドシートの各要素(ファイル全体、シート、セル範囲など)に「キーと値のペア」で情報を紐付ける機能です。イメージとしては、ユーザーには見えない、スクリプトだけが読み書きできる付箋のようなものです。
▼ 主な使い道
- スクリプトの設定情報を保存:
API_KEYやdocument_idなど、スクリプトの動作に必要な設定をシート自体に保存する。 - 外部データとのID連携: スプレッドシートの特定の行に、顧客管理システムの
customer_idを紐付ける。 - 処理ステータスの管理: 「処理済み」「エラーあり」といったスクリプトの処理状況を、ユーザーに意識させずに記録する。
プロパティサービスと違い、情報はドキュメント自体に保存されるため、シートをコピーすればメタデータも一緒にコピーされるのが特徴です。
基本操作: getDeveloperMetadata()でメタデータを取得する
getDeveloperMetadata() は、指定したオブジェクト(スプレッドシート、シート、範囲など)に紐づく全てのメタデータを DeveloperMetadata オブジェクトの配列として取得します。
▼ スプレッドシート全体のメタデータを取得するコード
function getAllMetadataFromSpreadsheet() {
const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
// スプレッドシート全体のメタデータを配列で取得
const metadataArray = spreadsheet.getDeveloperMetadata();
// 取得したメタデータをループ処理で表示
metadataArray.forEach(meta => {
console.log(`キー: ${meta.getKey()}, 値: ${meta.getValue()}`);
});
}
場所を指定してメタデータを取得する
メタデータは、シートやセル範囲など、より細かい単位で設定・取得できます。
▼ 特定シートのメタデータを取得 「注文明細」シートにだけ関連する設定値を取得する例です。
function getMetadataFromSheet() {
const sheet = SpreadsheetApp.getActive().getSheetByName('注文明細');
// '注文明細'シートに紐づくメタデータを取得
const sheetMetadata = sheet.getDeveloperMetadata();
sheetMetadata.forEach(meta => {
console.log(`キー: ${meta.getKey()}, 値: ${meta.getValue()}`);
});
}
▼ 特定範囲(セル)のメタデータを取得 商品リストの各行に商品IDがメタデータとして紐づいている場合に、それを取得します。
function getMetadataFromRange() {
const sheet = SpreadsheetApp.getActive().getSheetByName('商品リスト');
const range = sheet.getRange('A2:A10'); // 商品IDが設定されている範囲
// 指定範囲に紐づくメタデータを取得
const rangeMetadata = range.getDeveloperMetadata();
rangeMetadata.forEach(meta => {
// メタデータが紐づくセルの行番号を取得
const row = meta.getLocation().getRow();
console.log(`${row}行目の商品ID: ${meta.getValue()}`);
});
}
【超重要】特定のメタデータだけを効率的に検索する方法
getDeveloperMetadata() は便利ですが、メタデータが増えると全ての情報を取得するのは非効率です。特定のキーを持つメタデータだけを狙って取得したい場合は、createDeveloperMetadataFinder() を使いましょう。
function findSpecificMetadata() {
const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
// ファインダーを作成し、検索条件を指定
const finder = spreadsheet.createDeveloperMetadataFinder()
.withKey('customer_id') // キーが 'customer_id' のものを探す
.find(); // 条件に合うメタデータを取得
finder.forEach(meta => {
const row = meta.getLocation().getRow();
console.log(`${row}行目で見つかりました: Key=${meta.getKey()}, Value=${meta.getValue()}`);
});
}
これにより、大量のメタデータの中から必要な情報だけを高速に抽出できます。
メタデータ利用時の注意点 - セキュリティとパフォーマンス
1. セキュリティと可視性(Visibility)
メタデータには、APIキーなどの機密情報も保存できます。その際は、可視性 (Visibility) の設定が極めて重要です。
DOCUMENT: ドキュメントにアクセス権限があるユーザーなら、誰でもスクリプト経由で読み書きできる。(共有範囲が広い)PROJECT: このメタデータを追加したスクリプトからしかアクセスできない。(最も安全)
機密情報を保存する場合は、必ず可視性を PROJECT に設定してください。
// 【安全な保存方法】機密情報をPROJECTの可視性で保存する例
function saveSecretKey() {
const range = SpreadsheetApp.getActiveRange();
range.addDeveloperMetadata(
'api_key',
'sk_live_xxxxxxxxxx', // ここに実際のAPIキー
SpreadsheetApp.DeveloperMetadataVisibility.PROJECT
);
}
2. パフォーマンスの最適化
メタデータの読み書きは、通常のセル操作より少し時間がかかります。特にループ内で何度も getDeveloperMetadata() を呼び出すと、パフォーマンスが著しく低下することがあります。
頻繁に使うメタデータは、一度取得したら CacheService を使って一時的に保存し、処理を高速化するのがベストプラクティスです。
function getCachedMetadata(key) {
const cache = CacheService.getScriptCache();
const cached = cache.get(key);
if (cached != null) {
return cached; // キャッシュがあればそれを返す
}
// キャッシュがなければメタデータを取得
const finder = SpreadsheetApp.getActiveSpreadsheet()
.createDeveloperMetadataFinder().withKey(key).find();
if (finder.length > 0) {
const value = finder[0].getValue();
cache.put(key, value, 600); // 10分間キャッシュに保存
return value;
}
return null;
}
まとめ
開発者メタデータは、GASスクリプトの可能性を大きく広げる強力な機能です。
- 隠し情報の管理: ユーザーに見せる必要のない設定値やIDを安全にシートへ埋め込める。
- セキュリティの確保:
PROJECT可視性を使い、機密情報を保護する。 - パフォーマンスの向上: Finderやキャッシュを駆使して、高速な処理を維持する。
これらのポイントを押さえ、あなたのスプレッドシート自動化をさらに一段階レベルアップさせましょう。



先日Googleカレンダーの予定を Slackに通知するGAS(Google Apps Script)を作ってみた際に、 「プロパティサービス」という機能を知りました。 今回は備忘も兼ねて投稿します。 プロパティサービスとは スクリプトは、1 つのスクリプト、1 つのスクリプトのユーザー、または 1 つのアドオンが使用されるドキュメントにスコープされた Key-Value ペア形式のシンプルなデータを保存できます。スクリプト間でプロパティを共有することはできません。 Google Workspace Apps Script リファレンス Class Properti
とある理由で、PropertiesやCache以外でデータを保存する方法を検討しました MetadataFinderを使わないと見つけられないのでソース修正しました 1.PropertiesとCache どちらも、そのスクリプト内でしか利用できないんですね。 なんでこんな...