【问题标题】:Google spreadsheet, how to protect Cell?谷歌电子表格,如何保护细胞?
【发布时间】:2016-08-01 21:41:27
【问题描述】:

我创建了 excel 文件并保护了该文件中的某些字段。在 Office excel 中,我的一些单元格被锁定以进行编辑,开始我将我的 excel 文件上传到谷歌驱动器中,转换 - true (是否将此文件转换为相应的谷歌文档格式。(默认值:false))但在谷歌电子表格中我可以编辑锁定的单元格,如何在谷歌电子表格中锁定一些单元格?

创建excel文件

    $phpExcel = new \PHPExcel();
    $ews = $phpExcel->getSheet(0);
    $ews->setTitle(Reports::LIST_AOG);
    $ews->getProtection()->setSheet(true);
    $ews
        ->getStyle('E6:F36')
        ->getProtection()->setLocked(
            \PHPExcel_Style_Protection::PROTECTION_UNPROTECTED
        );

现在我只能编辑我电脑文件中的 E6:F36 单元格,然后上传到谷歌驱动器

$insertArray = [
        'mimeType' => $fileUpload->getMimeType(),
        'uploadType' => 'media',
        'data' => file_get_contents($fileUpload),
        'convert' => true
    ];

    $service = new \Google_Service_Drive($client->getGoogleClient());
    $file = new \Google_Service_Drive_DriveFile();

    $file->setTitle($nameFile);
    $file->setMimeType($fileUpload->getMimeType());

    try {
        $createdFile = $service->files->insert($file, $insertArray);
        $spreadsheetId = $createdFile->getId();
    } catch (\Exception $e) {
        $view = $this->view((array)GoogleDriveController::ERROR_OCCURRED . $e->getMessage(), 400);
        return $this->handleView($view);
    }

我正在寻找谷歌电子表格 API 包 asimlqt/php-google-spreadsheet-client,但找不到如何保护

    $serviceRequest = new DefaultServiceRequest($arrayAccessTokenClient['access_token']);
    ServiceRequestFactory::setInstance($serviceRequest);

    $spreadsheetService = new SpreadsheetService();

    $spreadsheet = $spreadsheetService->getSpreadsheetById($spreadsheetId);
    $worksheetFeed = $spreadsheet->getWorksheets();
    $cellFeed = $worksheet->getCellFeed();

    $cellFeed->editCell(1, 1, 'developer');
    $cellFeed->editCell(1, 2, 'hors');
    $cellFeed->editCell(10, 2, 'sum');

或者如何使用asimlqt/php-google-spreadsheet-client 保护单元格?

并且在谷歌电子表格中,我可以编辑任何单元格((((谁知道谷歌电子表格中受保护的单元格很热?

更新

我阅读了Google Sheets API 并尝试创建请求,我有这个

    $arrayAccessTokenClient = json_decode($client->getGoogleClient()->getAccessToken(), true);

    $serviceRequest = new DefaultServiceRequest($arrayAccessTokenClient['access_token']);
    ServiceRequestFactory::setInstance($serviceRequest);

    $spreadsheetService = new SpreadsheetService();

    $spreadsheet = $spreadsheetService->getSpreadsheetById($spreadsheetId);
    $worksheetFeed = $spreadsheet->getWorksheets();
    $worksheet = $worksheetFeed->getByTitle(Reports::LIST_AOG);


        $addProtectedRange['addProtectedRange'] = [
        'protectedRange' => [
            'range' => [
                'sheetId' => $worksheet->getGid(),
                'startRowIndex' => 3,
                'endRowIndex' => 4,
                'startColumnIndex' => 0,
                'endColumnIndex' => 5,
            ],
            'description' => "Protecting total row",
            'warningOnly' => true
        ]
    ];
    $guzzle = new Client();
    $putTeam = $guzzle
        ->post('https://sheets.googleapis.com/v4/spreadsheets/'.$spreadsheetId.':batchUpdate?key='.$arrayAccessTokenClient['access_token'],
            [],
            json_encode($addProtectedRange)
        )
        ->send()
        ->getBody(true);
    $answer = json_decode($putTeam, true);

但是有

Client error response
[status code] 401
[reason phrase] Unauthorized
[url]  https://sheets.googleapis.com/v4/spreadsheets/1M_NFvKMZ7Rzbj9ww86AJRMto1UesIy71840r2sxbD5Y:batchUpdate?key=myAccessToken

早期我有带有访问令牌的 Google Api Clien,我可以更改单元格并使用 google 电子表格进行更新,并且工作正常,但 https://sheets.googleapis.com/v4/spreadsheets/'.$spreadsheetId.':batchUpdate?key='.$arrayAccessTokenClient['access_token'],

返回 401,我不明白为什么以及如何更正。帮助

【问题讨论】:

    标签: php google-spreadsheet-api google-api-php-client


    【解决方案1】:

    我认为 Google 电子表格允许在受保护的 MSExcel 工作表成为 Google 文档时对其进行编辑。 MSExcel 的规则并不总是适用于 Google 表格。读自Adding Named or Protected Ranges

    以下电子表格.batchUpdate 请求包含两个请求 对象。第一个将范围 A1:E3 命名为“Counts”。第二 为范围 A4:E4 提供警告级别的保护。 这个级别 保护仍然允许编辑范围内的单元格,但是 在进行更改之前提示警告

    这个thread也有同样的看法。

    但是,如果您要保护的是 google 电子表格文件,请查看this guide

    【讨论】:

    • 让我们从这个开始。 'sheetId' 不是 'spreadsheetId'。 sheetId 是 URL 中“gid”之后的数字,例如 gid=1234567。在这种情况下,1234567 是 sheetId
    • 更新问题。我替换为$worksheet->getGid() 但仍有410 Unauthorized
    • 为什么未经授权,如果使用此$arrayAccessTokenClient['access_token'] 我编辑单元格,一切都很好
    • 由于您使用的是 Sheets API,因此必须启用它
    • 在我的应用中启用了 Sheets API,并且使用 asimlqt/php-google-spreadsheet-client 我可以编辑电子表格中的单元格,并且一切都很好
    【解决方案2】:

    我读了documentation

            $addProtectedRange['requests'] = [
            'addProtectedRange' => [
                'protectedRange' => [
                    'range' => [
                        'sheetId' => $worksheetGid,
                        'startRowIndex' => $startRowIndex,
                        'endRowIndex' => $endRowIndex,
                        'startColumnIndex' => $startColumnIndex,
                        'endColumnIndex' => $endColumnIndex,
                    ],
                    'description' => "Protecting total row",
                    'warningOnly' => false,
                    'editors' => [
                        'users' => [
                            "shuba.ivan.vikt@gmail.com"
                        ]
    ]
                ],
            ]
        ];
    

    这个file_get_contents变种,因为Guzzle没有从谷歌返回json响应,像这样:

    {
     "protectedRangeId": number,
     "range": {
       object(GridRange)
     },
     "namedRangeId": string,
     "description": string,
     "warningOnly": boolean,
     "requestingUserCanEdit": boolean,
     "unprotectedRanges": [
       {
         object(GridRange)
       }
     ],
      "editors": {
       object(Editors)
     },
    }
    

    我为此创建了新的question 用于 Guzzle 响应

    这是更新保护编辑单元格的变体

        $addProtectedRangeJson = json_encode($addProtectedRange);
        $url = 'https://sheets.googleapis.com/v4/spreadsheets/' . $spreadsheetId . ':batchUpdate';
        $opts = array('http' =>
            array(
                'method' => 'POST',
                'header' => "Content-type: application/json\r\n" .
                    "Authorization: Bearer $arrayAccessTokenClient\r\n",
                'content' => $addProtectedRangeJson
            )
        );
    
        $context = stream_context_create($opts);
        $response = file_get_contents($url, FALSE, $context);
        $answer = json_decode($response, TRUE);
    
        $addProtectedRangeUpdate['requests'] = [
            'updateProtectedRange' => [
                'protectedRange' => [
                    'protectedRangeId' => $protectedRangeId,
                    'warningOnly' => false,
                    'editors' => [
                        'users' => [
                            "shuba.ivan.vikt@gmail.com"
                        ]
                    ]
                ],
                'fields' => "namedRangeId,warningOnly,editors"
            ]
        ];
        $addProtectedRangeUpdateJson = json_encode($addProtectedRangeUpdate);
        $optsUpdate = array('http' =>
            array(
                'method' => 'POST',
                'header' => "Content-type: application/json\r\n" .
                    "Authorization: Bearer $arrayAccessTokenClient\r\n",
                'content' => $addProtectedRangeUpdateJson
            )
        );
    
        $contextUpdate = stream_context_create($optsUpdate);
        $responseUpdate = file_get_contents($url, FALSE, $contextUpdate);
        $answerUpdate = json_decode($responseUpdate, TRUE);
    

    这是 Guzzle,但是没有 google json 响应的 Guzzle 很糟糕,我等一下,也许谁知道这是什么问题,因为标准 php 函数 file_get_contents 工作得很好,而且我有 json google 响应。但是没有响应,这个变体工作正常,单元格在电子表格中受到保护

        $guzzle = new Client();
    
        $postCell = $guzzle
            ->post('https://sheets.googleapis.com/v4/spreadsheets/' . $spreadsheetId . ':batchUpdate',
                [],
                $addProtectedRangeJson
            )
            ->addHeader('Authorization', 'Bearer ' . $arrayAccessTokenClient)
            ->addHeader('Content-type', 'application/json')
        ;
        $postCell
            ->send()
            ->getBody(true)
        ;
        $contents = (string) $postCell->getBody();// get body that I post -> my request, not response 
        $contents = $postCell->getBody()->getContents();// not find getContents, ask me did you mean to call getContentMd5
        $answer = json_decode($postCell->getResponse()->getBody(), true);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-23
      • 1970-01-01
      相关资源
      最近更新 更多