PHP - Google API 复制并粘贴保持原始格式的行
PHP - Google API Copy and Paste row keeping the original format
我有 2 个 google 电子表格文档,MainSpreadsheet 和 SecondarySpreadSheet。 MainSpreadsheet 有很多行,其中一些我需要复制并保留样式格式。所以我需要从 MainSpreadSheet 中取出一些特定的行,然后使用 Google API PHP 将它们粘贴到 SecondarySpreadSheet 中。我尝试使用 class 名称 Google_Service_Sheets_CopyPasteRequest() 但我无法解决问题。你们能帮我复制和粘贴与 MainSpreadsheet 相同的格式样式吗?
感谢你们的时间。
$newSpreadSheetID = '12345' ;
$mainSpreadSheetID = '54321';
$client = new \Google_Client();
$client->setApplicationName('NAME');
$client->setScopes([\Google_Service_Sheets::SPREADSHEETS]);
$client->setAccessType('offline');
$client->setAuthConfig('credentials.json');
$service = new Google_Service_Sheets($client);
/**
* Copy from the Main Sheet
*/
$mainFirstSheetID = null;
$worksheetSheets = $service->spreadsheets->get($mainSpreadSheetID)->sheets;
foreach($worksheetSheets as $sheet){
$mainFirstSheetID = $sheet->properties['sheetId'];
}
$copyRange = new Google_Service_Sheets_GridRange();
$copyRange->setSheetId($mainFirstSheetID);
$copyRange->setStartRowIndex(10);
$copyRange->setEndRowIndex(11);
$copyRange->setStartColumnIndex(0);
$copyRange->setEndColumnIndex(400);
/**
* Paste in the new SHEET
*/
$newSheetID = null;
$worksheetSheets = $service->spreadsheets->get($newSpreadSheetID)->sheets;
foreach($worksheetSheets as $sheet){
$newSheetID = $sheet->properties['sheetId'];
}
$pasteRange = new Google_Service_Sheets_GridRange();
$pasteRange->setSheetId($newSheetID);
$pasteRange->setStartRowIndex(10);
$pasteRange->setEndRowIndex(11);
$pasteRange->setStartColumnIndex(0);
$pasteRange->setEndColumnIndex(400);
$copypasteRequest = new Google_Service_Sheets_CopyPasteRequest();
$copypasteRequest->setSource($copyRange);
$copypasteRequest->setDestination($pasteRange);
$request = new Google_Service_Sheets_Request();
$request->setCopyPaste($copypasteRequest);
$batchUpdateRequest = new Google_Service_Sheets_BatchUpdateSpreadsheetRequest();
$batchUpdateRequest->setRequests($request);
$newSpreadsheet = $service->spreadsheets->get($newSpreadSheetID);
$mainSpreadsheet = $service->spreadsheets->get($mainSpreadSheetID);
$finalRowRange = $newSpreadsheet->range;
$finalRowStartPosition = strpos($newSpreadsheet->range,':') + 2;
$finalRow = intval(substr($finalRowRange,$finalRowStartPosition));
if($finalRow <= $pasteRange['startRowIndex']){
$appendDimensionRequest = new Google_Service_Sheets_AppendDimensionRequest();
$appendDimensionRequest->setSheetId($newSheetID);
$appendDimensionRequest->setDimension("ROWS");
$appendDimensionRequest->setLength(1);
$appendRequest = new Google_Service_Sheets_Request();
$appendRequest->setAppendDimension($appendDimensionRequest);
$appendEmptyRowBatchUpdateRequest = new Google_Service_Sheets_BatchUpdateSpreadsheetRequest();
$appendEmptyRowBatchUpdateRequest->setRequests($appendRequest);
$service->spreadsheets->batchUpdate($newSpreadSheetID, $appendEmptyRowBatchUpdateRequest);
}
$service->spreadsheets->batchUpdate($newSpreadSheetID, $batchUpdateRequest);
$service->spreadsheets_values->update(
$newSpreadSheetID,
$finalRow,
$copypasteRequest
);
我认为您的目标和现状如下。
- 您想将“MAIN SHEET”的 Spreadsheet 行复制到“NEW SHEET”的 Spreadsheet 的第一个空行。
- 您不仅要复制值,还要复制单元格格式。
- 您想使用 googleAPI 实现 PHP。
- 您已经能够使用 Sheets API.
获取和放置 Google Spreadsheet 的值
修改点:
不幸的是,batchUpdate 方法的“CopyPasteRequest”无法从 Google Spreadsheet 复制到其他 Google Spreadsheet。好像这是目前的规格。
为了不仅复制值,还复制单元格格式,从 Google Spreadsheet "MAIN SHEET" 到 google传播sheet《NEWSHEET》,我想推荐以下流程。
- 将源Spreadsheet中的源sheet复制到目标Spreadsheet.
- 检索目标的第一个空行号 sheet。
- 将复制的 sheet 格式的值复制到目标 sheet。并且,删除复制的 sheet.
此流程来自 。但这是 python 脚本。因此,为了将此流程用于 PHP,我回答了一个示例脚本。将以上几点反映到一个脚本中,就变成了这样。
示例脚本:
在此示例脚本中,使用了您的 $service
。所以请添加授权脚本。并且,请为 运行 脚本设置变量。
$service = new Google_Service_Sheets($client); // <--- This is from your script.
$copiedRowNumber = 16; // Please set the row number of "MAIN SHEET" that you want to copy.
$sourceSpreadsheetId = "###"; // Please set the source Spreadsheet ID.
$sourceSheetId = "0"; // Please set the source sheet ID.
$destinationSpreadsheetId = "###"; // Please set the destination Spreadsheet ID.
$destinationSheetName = "Página1"; // Please set the destination sheet name.
$destinationSheetId = "0"; // Please set the destination sheet ID.
// 1. Copy the source sheet in the source Spreadsheet to the destination Spreadsheet.
$requestBody = new Google_Service_Sheets_CopySheetToAnotherSpreadsheetRequest(
array("destinationSpreadsheetId" => $destinationSpreadsheetId)
);
$res1 = $service->spreadsheets_sheets->copyTo($sourceSpreadsheetId, $sourceSheetId, $requestBody);
$copiedSheetId = $res1["sheetId"];
// 2. Retrieve 1st empty row number of the destination sheet.
$res2 = $service->spreadsheets_values->get($destinationSpreadsheetId, $destinationSheetName);
$row = count($res2["values"]);
// 3. Copy the values with the format from the copied sheet to the destination sheet. And, delete the copied sheet.
$requests = [
new \Google_Service_Sheets_Request([
'copyPaste' => [
'source' => [
'sheetId' => $copiedSheetId,
'startRowIndex' => $copiedRowNumber - 1,
'endRowIndex' => $copiedRowNumber,
],
'destination' => [
'sheetId' => $destinationSheetId,
'startRowIndex' => $row,
'endRowIndex' => $row + 1
],
'pasteType' => 'PASTE_NORMAL',
],
]),
new \Google_Service_Sheets_Request([
'deleteSheet' => ['sheetId' => $copiedSheetId]
])
];
$batchUpdateRequest = new \Google_Service_Sheets_BatchUpdateSpreadsheetRequest(['requests' => $requests]);
$res3 = $service->spreadsheets->batchUpdate($destinationSpreadsheetId, $batchUpdateRequest);
注:
- 在此示例脚本中,假设您的
$service = new Google_Service_Sheets($client);
可用于使用上述脚本。请注意这一点。
参考文献:
我有 2 个 google 电子表格文档,MainSpreadsheet 和 SecondarySpreadSheet。 MainSpreadsheet 有很多行,其中一些我需要复制并保留样式格式。所以我需要从 MainSpreadSheet 中取出一些特定的行,然后使用 Google API PHP 将它们粘贴到 SecondarySpreadSheet 中。我尝试使用 class 名称 Google_Service_Sheets_CopyPasteRequest() 但我无法解决问题。你们能帮我复制和粘贴与 MainSpreadsheet 相同的格式样式吗? 感谢你们的时间。
$newSpreadSheetID = '12345' ;
$mainSpreadSheetID = '54321';
$client = new \Google_Client();
$client->setApplicationName('NAME');
$client->setScopes([\Google_Service_Sheets::SPREADSHEETS]);
$client->setAccessType('offline');
$client->setAuthConfig('credentials.json');
$service = new Google_Service_Sheets($client);
/**
* Copy from the Main Sheet
*/
$mainFirstSheetID = null;
$worksheetSheets = $service->spreadsheets->get($mainSpreadSheetID)->sheets;
foreach($worksheetSheets as $sheet){
$mainFirstSheetID = $sheet->properties['sheetId'];
}
$copyRange = new Google_Service_Sheets_GridRange();
$copyRange->setSheetId($mainFirstSheetID);
$copyRange->setStartRowIndex(10);
$copyRange->setEndRowIndex(11);
$copyRange->setStartColumnIndex(0);
$copyRange->setEndColumnIndex(400);
/**
* Paste in the new SHEET
*/
$newSheetID = null;
$worksheetSheets = $service->spreadsheets->get($newSpreadSheetID)->sheets;
foreach($worksheetSheets as $sheet){
$newSheetID = $sheet->properties['sheetId'];
}
$pasteRange = new Google_Service_Sheets_GridRange();
$pasteRange->setSheetId($newSheetID);
$pasteRange->setStartRowIndex(10);
$pasteRange->setEndRowIndex(11);
$pasteRange->setStartColumnIndex(0);
$pasteRange->setEndColumnIndex(400);
$copypasteRequest = new Google_Service_Sheets_CopyPasteRequest();
$copypasteRequest->setSource($copyRange);
$copypasteRequest->setDestination($pasteRange);
$request = new Google_Service_Sheets_Request();
$request->setCopyPaste($copypasteRequest);
$batchUpdateRequest = new Google_Service_Sheets_BatchUpdateSpreadsheetRequest();
$batchUpdateRequest->setRequests($request);
$newSpreadsheet = $service->spreadsheets->get($newSpreadSheetID);
$mainSpreadsheet = $service->spreadsheets->get($mainSpreadSheetID);
$finalRowRange = $newSpreadsheet->range;
$finalRowStartPosition = strpos($newSpreadsheet->range,':') + 2;
$finalRow = intval(substr($finalRowRange,$finalRowStartPosition));
if($finalRow <= $pasteRange['startRowIndex']){
$appendDimensionRequest = new Google_Service_Sheets_AppendDimensionRequest();
$appendDimensionRequest->setSheetId($newSheetID);
$appendDimensionRequest->setDimension("ROWS");
$appendDimensionRequest->setLength(1);
$appendRequest = new Google_Service_Sheets_Request();
$appendRequest->setAppendDimension($appendDimensionRequest);
$appendEmptyRowBatchUpdateRequest = new Google_Service_Sheets_BatchUpdateSpreadsheetRequest();
$appendEmptyRowBatchUpdateRequest->setRequests($appendRequest);
$service->spreadsheets->batchUpdate($newSpreadSheetID, $appendEmptyRowBatchUpdateRequest);
}
$service->spreadsheets->batchUpdate($newSpreadSheetID, $batchUpdateRequest);
$service->spreadsheets_values->update(
$newSpreadSheetID,
$finalRow,
$copypasteRequest
);
我认为您的目标和现状如下。
- 您想将“MAIN SHEET”的 Spreadsheet 行复制到“NEW SHEET”的 Spreadsheet 的第一个空行。
- 您不仅要复制值,还要复制单元格格式。
- 您想使用 googleAPI 实现 PHP。
- 您已经能够使用 Sheets API. 获取和放置 Google Spreadsheet 的值
修改点:
不幸的是,batchUpdate 方法的“CopyPasteRequest”无法从 Google Spreadsheet 复制到其他 Google Spreadsheet。好像这是目前的规格。
为了不仅复制值,还复制单元格格式,从 Google Spreadsheet "MAIN SHEET" 到 google传播sheet《NEWSHEET》,我想推荐以下流程。
- 将源Spreadsheet中的源sheet复制到目标Spreadsheet.
- 检索目标的第一个空行号 sheet。
- 将复制的 sheet 格式的值复制到目标 sheet。并且,删除复制的 sheet.
此流程来自
示例脚本:
在此示例脚本中,使用了您的 $service
。所以请添加授权脚本。并且,请为 运行 脚本设置变量。
$service = new Google_Service_Sheets($client); // <--- This is from your script.
$copiedRowNumber = 16; // Please set the row number of "MAIN SHEET" that you want to copy.
$sourceSpreadsheetId = "###"; // Please set the source Spreadsheet ID.
$sourceSheetId = "0"; // Please set the source sheet ID.
$destinationSpreadsheetId = "###"; // Please set the destination Spreadsheet ID.
$destinationSheetName = "Página1"; // Please set the destination sheet name.
$destinationSheetId = "0"; // Please set the destination sheet ID.
// 1. Copy the source sheet in the source Spreadsheet to the destination Spreadsheet.
$requestBody = new Google_Service_Sheets_CopySheetToAnotherSpreadsheetRequest(
array("destinationSpreadsheetId" => $destinationSpreadsheetId)
);
$res1 = $service->spreadsheets_sheets->copyTo($sourceSpreadsheetId, $sourceSheetId, $requestBody);
$copiedSheetId = $res1["sheetId"];
// 2. Retrieve 1st empty row number of the destination sheet.
$res2 = $service->spreadsheets_values->get($destinationSpreadsheetId, $destinationSheetName);
$row = count($res2["values"]);
// 3. Copy the values with the format from the copied sheet to the destination sheet. And, delete the copied sheet.
$requests = [
new \Google_Service_Sheets_Request([
'copyPaste' => [
'source' => [
'sheetId' => $copiedSheetId,
'startRowIndex' => $copiedRowNumber - 1,
'endRowIndex' => $copiedRowNumber,
],
'destination' => [
'sheetId' => $destinationSheetId,
'startRowIndex' => $row,
'endRowIndex' => $row + 1
],
'pasteType' => 'PASTE_NORMAL',
],
]),
new \Google_Service_Sheets_Request([
'deleteSheet' => ['sheetId' => $copiedSheetId]
])
];
$batchUpdateRequest = new \Google_Service_Sheets_BatchUpdateSpreadsheetRequest(['requests' => $requests]);
$res3 = $service->spreadsheets->batchUpdate($destinationSpreadsheetId, $batchUpdateRequest);
注:
- 在此示例脚本中,假设您的
$service = new Google_Service_Sheets($client);
可用于使用上述脚本。请注意这一点。