JavaScript
gas
2
どのような問題がありますか?

投稿日

【GAS】プロパティサービスについてまとめる

はじめに

最近GASを使い始め、プロパティサービスを覚えたので忘備録として記録します。
GASでアクセストークンやAPIキーを使用する際、はじめは以下のようにハードコーディングを行っていました。

ダメな例
const apiKey = 'xxxxxxxxxxx';
const accessToken = 'yyyyyyyyyyyy';

しかし、セキュリティ的にまずいなと思い調べたところ、GASにはプロパティサービスという機能がありました。
これを使用することでハードコーディングを避けてセキュリティ性やメンテナンス性の高いコードが書けるようになります。

プロパティサービスとは

プロパティサービスとは、スクリプト内で使用する値を、キーと値をペアとして保存できるサービスです。
キーと値はいずれも文字列に変換されます。
プロジェクト内ならグローバルに読み書きが可能ですが、複数のプロジェクト間での共有はできません。

プロパティサービスの種類

プロパティサービスには以下の3種類のサービスが存在します。
1. スクリプトプロパティ
2. ユーザープロパティ
3. ドキュメントプロパティ

それぞれの違いをみていきます。

スクリプトプロパティ

プロジェクト内の全てのユーザーが、読み書き可能。
アプリケーション全体の設定値を格納するのに適している。

ユーザープロパティ

そのユーザーのみ読み書き可能。
ユーザー固有の設定値を格納するのに適している。

ドキュメントプロパティ

開いているドキュメントのアドオンのユーザーが、読み書き可能。
ドキュメント固有の設定値を格納するのに適している。

スクリプトプロパティを使ってみる

スクリプトプロパティの読み書きの方法についてみていきます。

少し話がずれるのですが、GASは2020年12月にエディタがアップデートされました。
このアップデートにより、旧エディタで可能であったGUI上でスクリプトプロパティの読み書きが、新エディタではできなくなりました。
セキュリティ上、GUIで設定値が見れるのはよくないと考えているので、
GUIでの読み書きの方法に関しては今回省略し、スクリプトでの読み書きの方法についてのみ記述します。

プロパティの追加

以下のように、各プロパティサービスのsetPropaty()を使用することで値を格納できます

プロパティの追加
// スクリプトプロパティ
var scriptProperties = PropertiesService.getScriptProperties();
scriptProperties.setProperty('SERVER_URL', 'http://www.example.com/');

// ユーザープロパティ
var userProperties = PropertiesService.getUserProperties();
userProperties.setProperty('EMAIL', 'hoge@test.com');

// ドキュメントプロパティ
var documentProperties = PropertiesService.getDocumentProperties();
documentProperties.setProperty('SOURCE_DATA_ID', '1234567890abcdefghijklmnopqrstuvwxyz');

getProperties()を使用すると一気に複数のプロパティを追加することも可能です。

var scriptProperties = PropertiesService.getScriptProperties();
scriptProperties.setProperties({
  'cow': 'moo',
  'sheep': 'baa',
  'chicken': 'cluck'
});

プロパティの取得

以下のように、各プロパティサービスのgetProperty()を使用することで値を格納できます。

プロパティの追加
// スクリプトプロパティ
var scriptProperties = PropertiesService.getScriptProperties();
scriptProperties.getProperty('SERVER_URL');

// ユーザープロパティ
var userProperties = PropertiesService.getUserProperties();
userProperties.setProperty('EMAIL');

// ドキュメントプロパティ
var documentProperties = PropertiesService.getDocumentProperties();
documentProperties.setProperty('SOURCE_DATA_ID');

getProperties()を使用すると複数の値を一気に取得できます。

プロパティの取得
var scriptProperties = PropertiesService.getScriptProperties();
var data = scriptProperties.getProperties();
for (var key in data) {
  Logger.log('Key: %s, Value: %s', key, data[key]);
}

プロパティの修正

プロパティの修正をしたい場合は再度serPropaty()を行うと、値が上書きされます。

プロパティの修正
var userProperties = PropertiesService.getUserProperties();
var units = userProperties.getProperty('DISPLAY_UNITS');
units = 'imperial';
userProperties.setProperty('DISPLAY_UNITS', units);

プロパティの削除

プロパティを削除したい場合、deletePropaty()を使用すると削除できます。

プロパティの削除
var userProperties = PropertiesService.getUserProperties();
userProperties.deleteProperty('DISPLAY_UNITS');

deleteAllPropaties()を使用すると全てのプロパティを削除できます。

var userProperties = PropertiesService.getUserProperties();
userProperties.deleteAllProperties();

機密情報を取り扱う

最後に、スクリプトプロパティでの機密情報の取り扱い方についてのメモ。
スクリプトプロパティは上述した通り、プロジェクト内のユーザーで編集権限があれば誰でも編集することができます。
そのため、機密情報を使用する際はスプレッドシートに値を記述し、そのスプレッドシートの編集権限(閲覧権限)とスクリプトの実行権限は特定のユーザーのみに限定することで、セキュリティを担保することができます。
やってみた記事をまた別で書こうと思います。

参考サイト

Class PropertiesService
Properties Service
Google Apps Scriptで使う情報はプロパティを利用しよう

ユーザー登録して、Qiitaをもっと便利に使ってみませんか。
  1. あなたにマッチした記事をお届けします
    ユーザーやタグをフォローすることで、あなたが興味を持つ技術分野の情報をまとめてキャッチアップできます
  2. 便利な情報をあとで効率的に読み返せます
    気に入った記事を「ストック」することで、あとからすぐに検索できます
chii-08

コメント

この記事にコメントはありません。
あなたもコメントしてみませんか :)
ユーザー登録
すでにアカウントを持っている方はログイン
記事投稿イベント開催中
2022年に流行る技術予想
~
2
どのような問題がありますか?
ユーザー登録して、Qiitaをもっと便利に使ってみませんか

この機能を利用するにはログインする必要があります。ログインするとさらに下記の機能が使えます。

  1. ユーザーやタグのフォロー機能であなたにマッチした記事をお届け
  2. ストック機能で便利な情報を後から効率的に読み返せる
ユーザー登録ログイン
ストックするカテゴリー