権限なぜか無視されてみんな編集できる問題終結

権限周りの一般的な説明はこっち.

tna-system-memo.hatenadiary.com

上の記事にも書いたとおり

編集者権限の中でのセル,シートの保護は,編集者の中でも編集できる人を変更できる.それによって下の授業データだけ保護できるはずであった.

実際に,

保護したい範囲を選択 -> 右クリック -> 範囲を保護

という手順で手動で保護すると保護でき,自分のアカウントで編集しようとすると触れなくなってる.が,スクリプト内でシートを保護する関数を起動してるので,作成された際に元からこの状態になるはずだし,実際に確認するといつもちゃんとその状態になってる.だがみんな編集できるっていう問題があった.(毎月手動でやればって問題もあったんだけど.)

ずっと不思議でごちゃごちゃ触ってたら気付かされた.

f:id:tna-teachers:20181020142555p:plain

上が不思議な状態で右は自分のアカウントで編集,普通に編集できちゃう.

f:id:tna-teachers:20181020142605p:plain

ちゃんと保護されてるよな,っていう確認するところ...

f:id:tna-teachers:20181020142638p:plain

f:id:tna-teachers:20181020142649p:plain

f:id:tna-teachers:20181020142657p:plain

3つの画像の流れからしてもちゃんとされてる,されてるなぁって完了して閉じて,でもなぁ,ってもっかい触ったら,

なんと編集できんくなった. 見た目は開けると保護されてるように見えてたけど完了までしてなかった?手動でそこを開いたら完了した?

てことでスクリプトほんとに完了されてるのかってのを確認したら見つかった.


  //シートを保護
  var MonthSheet = ss.getSheetByName(sheet.getRange("I6").getValue()+"月");
  MonthSheet.protect();

まず,上の記事でも書いたけど編集権限持ってる人しかスクリプト使えないので,Monthsheet全体を保護するとレポート閲覧のボタンすら触れなくなるのでよろしくない.結局効いてないから放置してたけどこのボタン使えなくなるの以外にトリッキーだからみんな気をつけて.

そんでこのスクリプトはこれで終わってしまってるんだけど編集できる人とかを与えてない....

f:id:tna-teachers:20181020144612p:plain

その場合編集権限全員が権限を持ってしまうからこの範囲に対する protection オブジェクトに対しての編集者を追加してそれ以外の編集者権限の人を外す関数を呼び出す必要があるとのこと.

  var protection = MonthSheet.getRange(5, 1, MonthSheet.getLastRow()-5, MonthSheet.getLastColumn()).protect();
  var me = Session.getEffectiveUser();
  protection.addEditor(me);
  protection.removeEditors(protection.getEditors());

実際にとある1つのセルで,

  • 手動で保護
  • 元のコードで保護, からの編集まだできることを確認してから保護されてるかの確認だけの作業をはさんでからの確認
  • 新しいコードで保護

試してみたら解決した.よかった.