gpsread Google ชีตปกป้องแผ่นงานพร้อมคำเตือน

Aug 20 2020

ฉันกำลังพยายามใช้gspreadไลบรารีเพื่อปกป้องแผ่นงานและเตือนผู้ใช้หากพวกเขากำลังจะทำการเปลี่ยนแปลงแม้ว่าพวกเขาจะเป็นผู้แก้ไขก็ตาม

ใน Google ชีตจะเรียกว่า "แสดงคำเตือนเมื่อแก้ไขช่วงนี้"

Gpsread มีฟังก์ชั่นที่นี่add_protected_range ผ่าน gpsread ฉันรันworksheet.add_protected_range('A1:J10', warning_only=True)และได้รับข้อผิดพลาด

gspread.exceptions.APIError: {'code': 400, 'message': 'คำขอไม่ถูกต้อง [0] .addProtectedRange: ProtectedRange is warningOnly ไม่สามารถตั้งค่าตัวแก้ไขได้ ',' status ':' INVALID_ARGUMENT '}

การนำออกwarning_onlyไม่ส่งคืนข้อผิดพลาด แต่ผู้แก้ไขยังคงสามารถแก้ไขได้ซึ่งไม่ใช่เป้าหมายของฉัน

ฉันจะทำงานนี้ได้อย่างไร

นอกจากนี้ฟังก์ชั่นนี้ใช้งานได้เพื่อป้องกันช่วงเท่านั้น มีวิธีทำให้ทั้งแผ่นป้องกันหรือไม่?

คำตอบ

1 Tanaike Aug 20 2020 at 08:36

ฉันเชื่อว่าเป้าหมายของคุณดังต่อไปนี้

  • คำถามที่ 1: คุณต้องการแสดงคำเตือนเมื่อผู้ใช้แก้ไขเซลล์A1:J10ในแผ่นงาน เมื่อผู้ใช้แก้ไขเซลล์ในช่วงที่ได้รับการป้องกันคุณต้องการแสดงหน้าจอคำเตือน
  • คำถามที่ 2: คุณต้องการป้องกันแผ่นงานแทนที่จะเป็นช่วง เมื่อผู้ใช้แก้ไขเซลล์ในแผ่นงานที่มีการป้องกันคุณต้องการแสดงหน้าจอคำเตือน

คำตอบสำหรับคำถาม 1:

เมื่อwarningOnlyเป็นtrueคุณสมบัติของการeditorsไม่สามารถใช้ แต่เมื่อฉันเห็นสคริปต์add_protected_rangeดูเหมือนว่าตัวแก้ไขเริ่มต้นจะรวมอยู่ด้วย Refฉันคิดว่าด้วยเหตุนี้ข้อผิดพลาดดังกล่าวจึงเกิดขึ้น ดังนั้นในกรณีนี้เพื่อหลีกเลี่ยงปัญหานี้จะใช้วิธี 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)
  • เมื่อเรียกใช้สคริปต์ด้านบนเซลล์ของ "A1: J10" ของ "Sheet1" จะได้รับการป้องกัน และเมื่อผู้ใช้แก้ไขเซลล์ในช่วงที่มีการป้องกันหน้าจอคำเตือนจะเปิดขึ้น

คำตอบสำหรับคำถาม 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" หน้าจอคำเตือนจะเปิดขึ้น

อ้างอิง:

  • Models.py ของ gspread
  • batch_update (เนื้อหา)
  • ProtectedRange