gpsread GoogleSheetsは警告でワークシートを保護します

Aug 20 2020

gspreadライブラリを使用してワークシートを保護し、編集者であっても変更を加えようとしている場合はユーザーに警告しようとしています。

Googleスプレッドシートでは、これは「この範囲を編集するときに警告を表示する」と呼ばれます

Gpsreadにはadd_protected_range Hereの機能があります。gpsreadを介して実行するworksheet.add_protected_range('A1:J10', warning_only=True)と、エラーが発生します

gspread.exceptions.APIError:{'コード':400、 'メッセージ': '無効なリクエスト[0] .addProtectedRange:ProtectedRangeはwarningOnlyです。エディターを設定することはできません。 '、' status ':' INVALID_ARGUMENT '}

削除しwarning_onlyてもエラーは返されませんが、編集者は引き続き編集できます。これは私の目標ではありません。

これを機能させるにはどうすればよいですか?

また、この関数は範囲を保護するためにのみ機能します。シート全体を保護する方法はありますか?

回答

1 Tanaike Aug 20 2020 at 08:36

私はあなたの目標を次のように信じています。

  • 質問1:ユーザーA1:J10がシートののセルを編集したときに警告を表示したいとします。ユーザーが保護範囲内のセルを編集するときに、警告画面を表示する必要があります。
  • 質問2:範囲ではなくシートを保護したい。ユーザーが保護されたシートのセルを編集するときに、警告画面を表示する必要があります。

質問1の回答:

ときはwarningOnlytrue、のプロパティeditors缶は使用できません。しかし、スクリプトを見たadd_protected_rangeところ、デフォルトのエディターが含まれているようです。参考これにより、このようなエラーが発生すると思います。したがって、この場合、これを回避するために、batchUpdateメソッドを直接使用するのはどうでしょうか。サンプルスクリプトは次のとおりです。

サンプルスクリプト:

spreadsheetId = "###" # Please set the Spreadsheet ID.
sheetName = "Sheet1" # Please set the sheet name.

client = gspread.authorize(credentials)
ss = client.open_by_key(spreadsheetId)
sheetId = ss.worksheet(sheetName)._properties['sheetId']
request_body = {
    "requests": [
        {
            "addProtectedRange": {
                "protectedRange": {
                    "range": {
                        "sheetId": sheetId,
                        "startRowIndex": 0,
                        "endRowIndex": 10,
                        "startColumnIndex": 0,
                        "endColumnIndex": 10
                    },
                    "warningOnly": True
                }
            }
        }
    ]
}
res = ss.batch_update(request_body)
  • 上記のスクリプトを実行すると、「Sheet1」の「A1:J10」のセルが保護されます。また、ユーザーが保護範囲内のセルを編集すると、警告画面が開きます。

質問2の回答:

この場合も、batchUpdateメソッドを直接使用するのはどうですか?サンプルスクリプトは次のとおりです。

サンプルスクリプト:

spreadsheetId = "###" # Please set the Spreadsheet ID.
sheetName = "Sheet1" # Please set the sheet name.

client = gspread.authorize(credentials)
ss = client.open_by_key(spreadsheetId)
sheetId = ss.worksheet(sheetName)._properties['sheetId']
request_body = {
    "requests": [
        {
            "addProtectedRange": {
                "protectedRange": {
                    "range": {
                        "sheetId": sheetId,
                    },
                    "warningOnly": True
                }
            }
        }
    ]
}
res = ss.batch_update(request_body)
  • 上記のスクリプトを実行すると、「Sheet1」のシートが保護されます。また、ユーザーが「Sheet1」のセルを編集すると、警告画面が開きます。

参照:

  • gspreadのmodels.py
  • batch_update(body)
  • ProtectedRange