あまり長く追記修正依頼でやりとりしてるのもなんですので、絞った回答を入れておきます。
otaomaさんが今できることと、やりたいことに少し距離があるように感じるので、
出来るところから少しずつ進めていくのが良いと思います。
なお、最初の追記修正依頼で、「セルの保護は色々あるんで」と書きましたが、
Googleスプレッドシートのセルの保護は、
- 編集しようとした時に警告を出す(基本的には誤操作の防止)
- 編集できる人を制限する(他の人に操作させない)
の2パターンです。2の編集できる人を制限する場合でも、スクリプトを実施する人(オーナー以外で範囲保護を実行する人)とオーナーは外すことは出来ません。
仮に2を希望される場合、宣言したセル範囲をrangeとすると、単に range.protect()
としても、
「保護はかかってる風ですが、スプレッドシートを編集できる人は全員編集できる保護」という、
意味の無い状態になるので、ここからスクリプトの実行者とオーナー以外を抜く必要があります。
また、保護の解除はやや面倒で、シートに対して現在設定されている保護を全て取得して、
その一つ一つの範囲をチェックして該当するものを解除という処理になります。
追記修正依頼のコメントのコードをベースにすると、以下のような感じですが、
最終的にチェックボックス変更時に動作させるなら、onEditにした方がいいですし、
他のシートで誤作動しないようにシート名も指定した方が良いです。
もう少し「範囲の保護 GAS」などのキーワードで検索し、
色々なサイトの解説を読まれて、コード動かしてから質問することをお勧めします。
function myFunction() {
var ss = SpreadsheetApp.getActiveSpreadsheet(); //アクティブなスプレッドシートを取得
var sheet = ss.getActiveSheet(); //シートを取得しましょう
var rng = ss.getActiveCell(); //アクティブセルを取得
var checkCol = 58 //BF列の 列番号 58
var row = rng.getRow(); //アクティブセルの行番号 = 保護する範囲の行番号
var col = rng.getColumn(); // アクティブセルの列番号 = チェックボックス判別用
var flag = rng.getValue(); //アクティブセルのチェックボックスの値を取得
if (col != checkCol) return; // チェックボックスの列以外は終了
if(flag == true){
//保護の実行
var targetRange = sheet.getRange("B"+row+":AW"+row); //保護する範囲
var protection = targetRange.protect(); //範囲を保護して
protection.removeEditors(protection.getEditors()); //関係ない人を抜く
} else if (flag == false) {
//保護の解除
var protections = sheet.getProtections(SpreadsheetApp.ProtectionType.RANGE); //シート内の保護を全て取得
for (var i = 0; i < protections.length; i++) {
var protection = protections[i];
var pRow = protection.getRange().getRow();
if (row == pRow) { //保護された行番号がアクティブセルの行と同じ場合保護解除
protection.remove();
}
}
}
}