PHP Google Sheets API v4 从前一行获取所有格式(条件、日期等)并应用于新行插入的最有效方法?
PHP Google Sheets API v4 Most efficient way to get all formatting - conditional, dates, etc - from preceeding row and apply to a new row insert?
大家好!
插入新数据行并应用前一行样式的最佳方法是什么?
(我们正在迁移 PHP 代码以使用 Google Sheets api v4 类)
我目前正在努力解决这个问题,并针对电子表格使用 Google_Service_Sheets_BatchUpdateSpreadsheetRequest->batchUpdate 我可以在代码中应用格式更改。但是,我不太确定可以循环访问的适当获取请求,以便获取现有格式并使用它们?
在旧货币中,我们根本不必担心这一点,因为我们只是针对 listFeed->insert 函数添加了新行的数据,该函数似乎会自行处理格式化方面。
但是现在的问题是我是否需要循环遍历一个范围内的每个单元格以获取格式,然后一次将该单元格应用于新行或者是否有更好的方法(例如现有的行级操作)?
我通常不会回答我自己的问题,但考虑到 Google 将在 2020 年 3 月关闭 v3 表格 API,我怀疑其他人可能会遇到这个问题。
正如我在针对原始问题的评论中提到的那样,v4 API 中没有访问单元格格式的现有方法。因此,没有选项可以循环遍历一个范围并将格式应用于另一个范围。
我的解决方法是复制/粘贴前一行(默认 PASTE_NORMAL 将复制所有值、公式、格式并合并 https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#pastetype),然后用所需的值。这为我提供了新行中具有现有格式的所需值:-
$sheetId = null;
$worksheetSheets = $this->spreadsheetService->spreadsheets->get($this->spreadsheetId)->sheets;
foreach($worksheetSheets as $sheet){
$sheetTitle = $sheet->properties['title'];
if ($sheetTitle === $this->worksheetTitle){
$sheetId = $sheet->properties['sheetId'];
break;
}
}
$copyRange = new Google_Service_Sheets_GridRange();
$copyRange->setSheetId($sheetId);
$copyRange->setStartRowIndex($nextRow - 2);
$copyRange->setEndRowIndex($nextRow - 1);
$copyRange->setStartColumnIndex(0);
$copyRange->setEndColumnIndex(400);
$pasteRange = new Google_Service_Sheets_GridRange();
$pasteRange->setSheetId($sheetId);
$pasteRange->setStartRowIndex($nextRow - 1);
$pasteRange->setEndRowIndex($nextRow);
$pasteRange->setStartColumnIndex(0);
$pasteRange->setEndColumnIndex(400);
$copypasteRequest = new Google_Service_Sheets_CopyPasteRequest();
$copypasteRequest->setSource($copyRange);
$copypasteRequest->setDestination($pasteRange);
//$copypasteRequest->pasteType(CopyPasteType.PASTE_NORMAL);
$request = new Google_Service_Sheets_Request();
$request-> setCopyPaste($copypasteRequest);
$batchUpdateRequest = new Google_Service_Sheets_BatchUpdateSpreadsheetRequest();
$batchUpdateRequest->setRequests($request);
// Need to check if sheet has an existing empty row to paste into
$finalRowRange = $this->worksheet['range'];
$finalRowStartPosition = strpos($this->worksheet['range'],':') + 2;
$finalRow = intval(substr($finalRowRange,$finalRowStartPosition));
if($finalRow <= $pasteRange['startRowIndex']){ // startRowIndex is a zero based array range, i.e. 348 actually corresponds to row 349 on sheet.
$appendDimensionRequest = new Google_Service_Sheets_AppendDimensionRequest();
$appendDimensionRequest->setSheetId($sheetId);
$appendDimensionRequest->setDimension("ROWS");
$appendDimensionRequest->setLength(1);
$appendRequest = new Google_Service_Sheets_Request();
$appendRequest->setAppendDimension($appendDimensionRequest);
$appendEmptyRowBatchUpdateRequest = new Google_Service_Sheets_BatchUpdateSpreadsheetRequest();
$appendEmptyRowBatchUpdateRequest->setRequests($appendRequest);
$this->spreadsheetService->spreadsheets->batchUpdate($this->spreadsheetId, $appendEmptyRowBatchUpdateRequest);
}
$this->spreadsheetService->spreadsheets->batchUpdate($this->spreadsheetId, $batchUpdateRequest);
// The actual data values insert
$this->spreadsheetService->spreadsheets_values->update(
$this->spreadsheetId,
$updateRange,
$valueRange,
$conf
);
我希望这对以后的人有用。
大家好!
插入新数据行并应用前一行样式的最佳方法是什么? (我们正在迁移 PHP 代码以使用 Google Sheets api v4 类)
我目前正在努力解决这个问题,并针对电子表格使用 Google_Service_Sheets_BatchUpdateSpreadsheetRequest->batchUpdate 我可以在代码中应用格式更改。但是,我不太确定可以循环访问的适当获取请求,以便获取现有格式并使用它们?
在旧货币中,我们根本不必担心这一点,因为我们只是针对 listFeed->insert 函数添加了新行的数据,该函数似乎会自行处理格式化方面。
但是现在的问题是我是否需要循环遍历一个范围内的每个单元格以获取格式,然后一次将该单元格应用于新行或者是否有更好的方法(例如现有的行级操作)?
我通常不会回答我自己的问题,但考虑到 Google 将在 2020 年 3 月关闭 v3 表格 API,我怀疑其他人可能会遇到这个问题。
正如我在针对原始问题的评论中提到的那样,v4 API 中没有访问单元格格式的现有方法。因此,没有选项可以循环遍历一个范围并将格式应用于另一个范围。
我的解决方法是复制/粘贴前一行(默认 PASTE_NORMAL 将复制所有值、公式、格式并合并 https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#pastetype),然后用所需的值。这为我提供了新行中具有现有格式的所需值:-
$sheetId = null;
$worksheetSheets = $this->spreadsheetService->spreadsheets->get($this->spreadsheetId)->sheets;
foreach($worksheetSheets as $sheet){
$sheetTitle = $sheet->properties['title'];
if ($sheetTitle === $this->worksheetTitle){
$sheetId = $sheet->properties['sheetId'];
break;
}
}
$copyRange = new Google_Service_Sheets_GridRange();
$copyRange->setSheetId($sheetId);
$copyRange->setStartRowIndex($nextRow - 2);
$copyRange->setEndRowIndex($nextRow - 1);
$copyRange->setStartColumnIndex(0);
$copyRange->setEndColumnIndex(400);
$pasteRange = new Google_Service_Sheets_GridRange();
$pasteRange->setSheetId($sheetId);
$pasteRange->setStartRowIndex($nextRow - 1);
$pasteRange->setEndRowIndex($nextRow);
$pasteRange->setStartColumnIndex(0);
$pasteRange->setEndColumnIndex(400);
$copypasteRequest = new Google_Service_Sheets_CopyPasteRequest();
$copypasteRequest->setSource($copyRange);
$copypasteRequest->setDestination($pasteRange);
//$copypasteRequest->pasteType(CopyPasteType.PASTE_NORMAL);
$request = new Google_Service_Sheets_Request();
$request-> setCopyPaste($copypasteRequest);
$batchUpdateRequest = new Google_Service_Sheets_BatchUpdateSpreadsheetRequest();
$batchUpdateRequest->setRequests($request);
// Need to check if sheet has an existing empty row to paste into
$finalRowRange = $this->worksheet['range'];
$finalRowStartPosition = strpos($this->worksheet['range'],':') + 2;
$finalRow = intval(substr($finalRowRange,$finalRowStartPosition));
if($finalRow <= $pasteRange['startRowIndex']){ // startRowIndex is a zero based array range, i.e. 348 actually corresponds to row 349 on sheet.
$appendDimensionRequest = new Google_Service_Sheets_AppendDimensionRequest();
$appendDimensionRequest->setSheetId($sheetId);
$appendDimensionRequest->setDimension("ROWS");
$appendDimensionRequest->setLength(1);
$appendRequest = new Google_Service_Sheets_Request();
$appendRequest->setAppendDimension($appendDimensionRequest);
$appendEmptyRowBatchUpdateRequest = new Google_Service_Sheets_BatchUpdateSpreadsheetRequest();
$appendEmptyRowBatchUpdateRequest->setRequests($appendRequest);
$this->spreadsheetService->spreadsheets->batchUpdate($this->spreadsheetId, $appendEmptyRowBatchUpdateRequest);
}
$this->spreadsheetService->spreadsheets->batchUpdate($this->spreadsheetId, $batchUpdateRequest);
// The actual data values insert
$this->spreadsheetService->spreadsheets_values->update(
$this->spreadsheetId,
$updateRange,
$valueRange,
$conf
);
我希望这对以后的人有用。