■はじめに
久しぶりの投稿はセル範囲の保護と、解除についてです。
セル範囲の保護はちょいちょいネット上でも記事書いてあったんですが、
セル範囲の解除についてはほとんど記事がなかったので、備忘録も兼ねて書いてみる事にしました。
■セル範囲の保護
セル範囲の保護をする場合は、割と情報でてるので書くの恐縮なんですが、
以下の様なソースで対応可能です。
const book = SpreadsheetApp.getActiveSpreadsheet();
const sheet = book.getActivesheet();
const protect = sheet.getRange(row,col,row2,col2).protect();
//オーナーは必ず権限を持つので注意
protect.addEditor(email); //単一ユーザー登録時
protect.addEditors(emailarry); //複数ユーザー登録時、配列を渡す
protect.setDomainEdit(true); //GWでドメインユーザーを許可する場合
■セル範囲の保護の解除
セルを解除する場合には以下の様なソースを使います。
const book = SpreadsheetApp.getActiveSpreadsheet();
const sheet = book.getActiveSheet();
const pType = SpreadsheetApp.ProtectionType;
const protect = sheet.getProtections(pType.RANGE);
for(let i=0; i<protect.length; i++){
protect[i].remove();
}
ただ、このソースだと、すべての範囲ロックを削除してしまいますので、
消してはマズいロックも含めて消してしまいます。
そこで、それが消していいロックかを確認する必要があるのですが、ぱっと思いつくのだと、行とか列の情報が取得できれば、対象行とか対象列のロックを解除できる筈です。
で、問題はその行とか列の情報どこにあんの?って話になるわけですが、
先ほどのソースで記述した「変数:protect[i]」内にRange情報を所持しています。
//行、列のスタート位置の取得
const sRow = protect[i].getRange().getRow();
const sCol = protect[i].getRange().getColumn();
//行、列の最終位置を取得したい時
const eRow = protect[i].getRange().getLastRow();
const eCol = protect[i].getRange().getLastColumn();
//行、列の範囲数を取得したい場合
const rRow = protect[i].getRange().getNumRows();
const rCol = protect[i].getRange().getNumColmuns();
と、上記の情報をうまく組み合わせると、任意の解除とかができるようになります。
■最後に
今回のような仕組を使ったツールの作成もできますので、
お困りの事ございましたら、お気軽にご相談くださいね(´ω`*)