GASでスプレッドシートのセルやシートを保護する方法(protectメソッド)

スプレッドシートで入力が不要で計算式や関数で使用しているシートやセルは保護をかけます。

このスプレッドシートの保護をGoogle Apps Script(GAS)で実行する方法と保護のGASサンプルコードを解説します。

スプレッドシートのセルやシートを保護

Googleスプレッドシートは自分だけでなく、他の人と共同編集する際によく用いられています。

スプレッドシートを共同で編集していると、編集者の誰かがシートのセルを書き換えます。

通常の編集で上書きするのではあれば問題ないですが、誤って消してしまうケースもあります。

そんなときに消してはいけないシートやセルを守るためにスプレッドシートにはエクセル同様保護の機能があります。

削除されたくないシートや、計算式で利用する数値が入っているセル範囲を保護機能で保護しておけば、共同編集しているメンバーが消す心配がなくなります。

Google Apps Scriptでシート・セルの保護が可能

実はGoogle Apps Scriptはスプレッドシート上で行うほとんどの操作をスクリプトで実行することができます。

そのため、シートや特定の範囲のセルを保護することもGASのコードで実現可能です。

シートやセルを保護するために、GASのprotect関数を使用します。

シートの場合は保護したいSheetオブジェクトでprotectメソッドを実行します。

Sheet.protect();

セルの特定範囲の場合は、Rangeオブジェクトでprotectメソッドを実行します。

Range.protect();

この1行を実行するだけで、シートやセルを保護することができます。

ただ、protectメソッドを実行しただけでは、シートを保護しても、編集権限を持つユーザー全てが編集可能です。

オーナー権限を持つアカウントのみ保護を行う場合は、getEditorsメソッドで保護対象を編集可能なユーザーを取得し、removeEditorsメソッドの引数に指定する必要があります。

Google Apps Scriptでスプレッドシートの保護を行う方法

実際にGoogle Apps Scriptでスプレッドシートのシート/セルを保護する方法をサンプルコードで解説します。

シートを保護するGASサンプルコード

シートを保護するGASのサンプルコードは以下の通りです。

function protectSheet(){
//スクリプトに紐付いたアクティブなシートを読み込む
let mySheet = SpreadsheetApp.getActiveSheet();
//読み込んだシートに保護を設定し、Protectionオブジェクトを変数に格納
let protections = mySheet.protect();
//保護したシートで編集可能なユーザーを取得
let userList = protections.getEditors();
//オーナーのみ編集可能にするため、編集ユーザーをすべて削除
//オーナーの編集権限は削除できないため、オーナーのみ編集可能に
protections.removeEditors(userList);
}

アクティブなシートを保護した上で、保護状態で編集できるユーザーを設定することでシートの保護をGASコードで実行しています。

GASのサンプルコードを実行すると、シートの左側に保護のアイコンが表示されています。

保護されているシートと範囲の右メニューでも、シート1が保護対象であることが確認可能です。

シート内のセル(範囲)を保護するGASサンプルコード

基本的にはシートを保護するGASのコードと変わりませんが、protectメソッドを実行するオブジェクトが変わります。

function protectCellRange(){
//スクリプトに紐付いたアクティブなシートを読み込む
let mySheet = SpreadsheetApp.getActiveSheet();
//読み込んだシートに保護を設定し、Protectionオブジェクトを変数に格納
let protectRange = mySheet.getRange(1,1,3,3);
let protections = protectRange.protect();
//保護したシートで編集可能なユーザーを取得
let userList = protections.getEditors();
//オーナーのみ編集可能にするため、編集ユーザーをすべて削除
//オーナーの編集権限は削除できないため、オーナーのみ編集可能に
protections.removeEditors(userList);
}

シートの場合は、Sheetオブジェクトでprotectメソッドを実行していましたが、セルの場合はRangeオブジェクトでprotectメソッドを実行します。

GASスクリプトのgetRangeで指定した範囲(A1セル~C3セル)に保護が設定されていることが確認できます。

以上のようにシートでも特定範囲のセルでも同様にGASコードで保護をかけられます。

保護対象の編集ユーザーや各種設定をGASでも

サンプルコードで紹介した方法は、シートやセルに対し、基本的な保護設定のみに実行しています。

スプレッドシートの保護では、保護内容を説明する概要や編集時に警告メッセージを表示するといった設定がGASスクリプトで可能です。

function protectSheet(){
//スクリプトに紐付いたアクティブなシートを読み込む
let mySheet = SpreadsheetApp.getActiveSheet();
//読み込んだシートに保護を設定し、Protectionオブジェクトを変数に格納
let protections = mySheet.protect();
//保護したシートで編集可能なユーザーを取得
let userList = protections.getEditors();
//オーナーのみ編集可能にするため、編集ユーザーをすべて削除
//オーナーの編集権限は削除できないため、オーナーのみ編集可能に
protections.removeEditors(userList);
//保護内容の説明文章を設定
protections.setDescription("GASで保護");
//保護を入力不可ではなく、入力時に警告を表示
protections.setWarningOnly(true);
}

setDescriptionメソッドで、保護の説明を入力し、setWarningOnlyメソッドで保護範囲を編集時に警告メッセージを表示することも可能です。

シートの保護解除もGASで可能

Google Apps Script(GAS)では保護されているシートやセルの保護解除もできるようになっています。

ProtectionオブジェクトをシートやセルのRangeから取得し、removeメソッドを実行することで保護を解除できます。

スプレッドシートで保護されているシート・セルを全て取得し、removeメソッドを実行することですべての保護を解除するといった処理もGASで実装可能です。

まとめ・終わりに

今回、Google Apps Scriptでスプレッドシートのシートや特定範囲のセルを保護する方法を紹介しました。

SheetオブジェクトやRangeオブジェクトでprotectメソッドを実行することで保護設定が可能になります。

ただ、protectメソッドだけでは不十分なので、編集可能ユーザーの調整や、警告表示のみの保護など細かい設定を行います。

GASで保護の操作ができるようになれば、保護も自動化が可能です。

新規シート作成した後に、他の人に数値を書き換えられないよう保護を設定しておくなどの使い方もできるので、ぜひGASで保護を活用してみてください。