2016-08-01 4 views
0

Я создаю файл excel и защищаю некоторое поле в этом файле. В Office excel все прекрасно, что моя ячейка заблокирована для редактирования, начните загрузку моего файла excel в google drive с convert-true (нужно ли преобразовать этот файл в соответствующий формат Документов Google. (По умолчанию: false)) Но в google spread-лист I может редактировать заблокированную ячейку, как заблокировать в google spread листе какую-то ячейку?Таблица Google, как защитить Cell?

создания файла 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 клетка моего файла в компьютере, а затем загрузить в Google диск

$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); 
    } 

Я Fing для таблицы Google апи пачке 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 распространение листа я могу любой редактировать любую клетку ((((Кто знает, что горячий защищаемую ячейку в Google spreat листе?

UPDATE

Я прочитал 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 и я не понимаю, почему и как исправить. Справка

ответ

0

Я думаю, что электронные таблицы google позволяют редактировать защищенные листы MSExcel в тот момент, когда они становятся документами Google. Правила для MSExcel не всегда применяются к Google Таблицам. Чтение из Adding Named or Protected Ranges:

Следующая запрос spreadsheets.batchUpdate содержит два запроса объектов. Первый дает диапазон A1: E3 имя «Counts». Второй обеспечивает защиту уровня предупреждения до диапазона A4: E4. Этот уровень защиты по-прежнему позволяет редактировать ячейки в пределах диапазона, но выдает предупреждение перед внесением изменений.

Этот thread также имеет тот же вид.

Однако, если это файл электронной таблицы google, который вы хотите защитить, отметьте this guide.

+0

Я обновляю свой вопрос, смотрите пожалуйста –

+0

Начнем с этого. «sheetId» не «spreadsheetId». sheetId - это число, следующее «gid», как gid = 1234567 в вашем URL-адресе. В этом случае 1234567 - это вопрос с вопросом о листе – noogui

+0

. Я заменяю на '$ worksheet-> getGid()' Но все же есть 410 Unauthorized –

0

Я прочитал documentation и

 $addProtectedRange['requests'] = [ 
     'addProtectedRange' => [ 
      'protectedRange' => [ 
       'range' => [ 
        'sheetId' => $worksheetGid, 
        'startRowIndex' => $startRowIndex, 
        'endRowIndex' => $endRowIndex, 
        'startColumnIndex' => $startColumnIndex, 
        'endColumnIndex' => $endColumnIndex, 
       ], 
       'description' => "Protecting total row", 
       'warningOnly' => false, 
       'editors' => [ 
        'users' => [ 
         "[email protected]" 
        ] 
] 
      ], 
     ] 
    ]; 

Этот file_get_contents вариант, потому что жрать не возвращается ответ JSon от Google, как это:

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

создать новую question для этого для жрать reasponse

Это вариант для модифицированной защищенной ячейки редактирования

$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' => [ 
         "[email protected]" 
        ] 
       ] 
      ], 
      '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); 

и это жрать, но жрать без Google ответ JSon это плохо я жду, может быть, кто знает, что это проблема, потому что стандартная функция 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);