如何通过PHP调用Google Sheets API自动扩展工作表行数?
解决Google Sheets API插入数据时行数超限的问题
问题分析
你遇到的Range exceeds grid limits错误是因为工作表当前行数不足,而你尝试的扩行代码错误地使用了DimensionRange对象作为请求——这并不是正确修改行数的请求类型。正确的方式是使用AppendDimensionRequest来追加新行。同时注意你原代码中的一个小错误:if(!$currentData->getValues)应该调用方法getValues(),而非直接访问属性,否则判断逻辑会失效。
正确的自动扩行实现
以下是整合了自动扩行逻辑的完整代码,在插入数据前先检查行数是否足够,不足则自动追加:
private function _addToSheet($data, $cites) { $resultList = array_values($data); // Path to the credentials JSON file $credentialsPath = storage_path('secret.json'); // Initialize the Google Client $client = new Google_Client(); $client->setApplicationName('Website Scrapping'); $client->setScopes([Google_Service_Sheets::SPREADSHEETS]); $client->setAuthConfig($credentialsPath); $client->setAccessType('offline'); // Create a Sheets service $sheetsService = new Google_Service_Sheets($client); $spreadsheetId = '******'; $sheetName = 'Sheet1'; // 1. 获取工作表基本信息(行数、sheetId) $spreadsheet = $sheetsService->spreadsheets->get($spreadsheetId); $sheet = $spreadsheet->getSheets()[0]; $sheetId = $sheet->getProperties()->getSheetId(); $currentRowCount = $sheet->getProperties()->getGridProperties()->getRowCount(); // 2. 获取当前已使用的行数,确定下一行位置 $currentData = $sheetsService->spreadsheets_values->get($spreadsheetId, "{$sheetName}!A:A"); $usedRows = count($currentData->getValues()); $nextRow = $usedRows + 1; // 3. 检查下一行是否超过当前工作表行数,不足则追加新行 if ($nextRow > $currentRowCount) { // 每次追加1000行,可根据需求调整 $rowsToAdd = 1000; // 构造追加行的请求 $appendRequest = new Google_Service_Sheets_AppendDimensionRequest([ 'sheetId' => $sheetId, 'dimension' => 'ROWS', 'length' => $rowsToAdd ]); // 构造批量更新请求 $batchUpdate = new Google_Service_Sheets_BatchUpdateSpreadsheetRequest([ 'requests' => [$appendRequest] ]); // 执行批量更新 $sheetsService->spreadsheets->batchUpdate($spreadsheetId, $batchUpdate); // 更新当前行数(可选,后续操作如果需要的话) $currentRowCount += $rowsToAdd; } // 4. 准备插入的数据 $time = date('d-m-Y H:i:s'); array_unshift($resultList, $time); $updateBody = new Google_Service_Sheets_ValueRange([ 'values' => [$resultList] ]); // 5. 指定插入范围并执行更新 $range = "{$sheetName}!A{$nextRow}:M{$nextRow}"; $result = $sheetsService->spreadsheets_values->update( $spreadsheetId, $range, $updateBody, ['valueInputOption' => 'RAW'] ); }
关键修改点说明
- 替换错误的请求类型:用
AppendDimensionRequest代替DimensionRange,这个请求专门用于向工作表追加行或列,参数length指定要追加的数量。 - 修正行数判断逻辑:正确调用
getValues()方法获取数据行,避免属性访问错误。 - 提前检查行数:在插入数据前判断下一行是否超出当前工作表行数,确保插入前已扩展足够空间。
内容的提问来源于stack exchange,提问作者oscar dev
相关产品推荐
相关产品推荐

