让Google Sheets的PHP库让我创建一个具有多个选项卡(表)的Electron 表格,这让我花了很长时间.为简单起见,代码段被截断

use Google\Service\Exception as ServiceException;
use Google\Service\Sheets;
use Google\Service\Sheets\AddSheetRequest;
use Google\Service\Sheets\BatchUpdateSpreadsheetRequest;
use Google\Service\Sheets\BatchUpdateValuesRequest;
use Google\Service\Sheets\SheetProperties;
use Google\Service\Sheets\Spreadsheet;
    
function addTabs($sheetId, array $tabNames) {
    $requests = [];

    foreach ($tabNames as $index => $tabName) {
        $request = new AddSheetRequest();
        $props = new SheetProperties();
        $props->setTitle($tabName);
        $props->setIndex($index);
        $request->setProperties($props);
        $requests[] = $request;
    }

    $batchRequest = new BatchUpdateSpreadsheetRequest();
    $batchRequest->setRequests($requests);

    try {
        $this->service->spreadsheets->batchUpdate($sheetId, $batchRequest);
    } catch (ServiceException $e) {
        dd($e);
    }
}

addTabs($id, ['A', 'B', 'C']);

得到这些错误.

    Invalid JSON payload received. Unknown name "properties" at 'requests[0]': Cannot find field.
    Invalid JSON payload received. Unknown name "properties" at 'requests[1]': Cannot find field.
    Invalid JSON payload received. Unknown name "properties" at 'requests[2]': Cannot find field.

我不知道这里出了什么问题,因为这似乎与文档中定义的规范相匹配 https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#AddSheetRequest

我try 过的另一个方法是在最初的Electron 表格创建请求中一次生成所有标签:

function createSheet()
{
    $sheetProps = [
        'properties' => [
            'title' => 'Test',
        ],
        'sheets' => [],
    ];
    $sheetRequest = new Spreadsheet($sheetProps);
    $sheet1 = [
        'properties' => [
            'title' => 'Tab 1',
        ],
        'data' => [
            'rowData' => [
                ['values' => [['userEnteredValue' => ['numberValue' => 1]], ['userEnteredValue' => ['numberValue' => 2]], ['userEnteredValue' => ['numberValue' => 3]]]],
                ['values' => [['userEnteredValue' => ['numberValue' => 4]], ['userEnteredValue' => ['numberValue' => 5]], ['userEnteredValue' => ['numberValue' => 6]]]],
            ],
        ],
    ];
    $sheet2 = [
        'properties' => [
            'title' => 'Tab 2',
        ],
        'data' => [
            'rowData' => [
                ['values' => [['userEnteredValue' => ['numberValue' => 1]], ['userEnteredValue' => ['numberValue' => 2]], ['userEnteredValue' => ['numberValue' => 3]]]],
                ['values' => [['userEnteredValue' => ['numberValue' => 4]], ['userEnteredValue' => ['numberValue' => 5]], ['userEnteredValue' => ['numberValue' => 6]]]],
            ],
        ],
    ];
    $sheetRequest = new Spreadsheet([
        'properties' => [
            'title' => 'Testing',
        ],
        'sheets' => [$sheet1, $sheet2],
    ]);

    return $this->service->spreadsheets->create($sheetRequest);
}

错误:

Invalid JSON payload received. Unknown name \"0\" at 'spreadsheet.sheets[0].data.row_data': Cannot find field.

如果我将上面的代码行改为以下代码,而不是数组,它就可以工作了.

 'sheets' => $sheet1

但规范清楚地将Spreadsheet.Sheets显示为一个数组:https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets#Spreadsheet

我错过了什么吗?有谁有使用PHP Sheets API创建多选项卡Electron 表格的好的实用示例吗?

推荐答案

当我看到您的显示脚本(顶部脚本)时,addSheet的属性不包括在内.我想这可能是你现在这个问题的原因.当这一点反映在您的第一个脚本中时,下面的修改如何?

修改后的脚本:

function addTabs($sheetId, array $tabNames) {
    $requests = [];
    foreach ($tabNames as $index => $tabName) {
        $addSheet = new \Google\Service\Sheets\Request(); // Added
        $request = new AddSheetRequest();
        $props = new SheetProperties();
        $props->setTitle($tabName);
        $props->setIndex($index);
        $request->setProperties($props);
        $addSheet->setAddSheet($request); // Added
        array_push($requests, $addSheet); // Added
    }
    $batchRequest = new BatchUpdateSpreadsheetRequest();
    $batchRequest->setRequests($requests);
    try {
        $this->service->spreadsheets->batchUpdate($sheetId, $batchRequest);
    } catch (ServiceException $e) {
        dd($e);
    }
}
  • 通过这种修改,requests如下所示.并且,向Electron 表格中插入3张表,即A、B和C.

    [
      {"addSheet":{"properties":{"hidden":null,"index":0,"rightToLeft":null,"sheetId":null,"sheetType":null,"title":"A"}}},
      {"addSheet":{"properties":{"hidden":null,"index":1,"rightToLeft":null,"sheetId":null,"sheetType":null,"title":"B"}}},
      {"addSheet":{"properties":{"hidden":null,"index":2,"rightToLeft":null,"sheetId":null,"sheetType":null,"title":"C"}}}]
    ]
    

参考资料:

Php相关问答推荐

在WooCommerce中执行一次银行电汇确认付款代码

尽管包含目标日期,但日期范围比较仍有意外输出

未在moodle上运行的计划任务

有什么方法可以阻止WordPress主题升级通知吗?

向在添加到购物车上动态创建的WooCommerce产品添加发货类别

在AJAX请求后,Laravel重定向.(不允许使用方法)

由于某种原因,FILE_GET_CONTENTS从一天到另一天停止工作,并在PHP 7.2.34中返回一条&http/1.1 406不能接受&的错误

我必须对所有的SQL查询使用预准备语句吗?

根据发货类别在WooCommerce产品页面中显示快捷代码

CKEDITOR-如何在PHP中判断提交后的空数据

使用DOMPDF获取PDF格式的本 map 像

Mockery在模拟Redis连接时抛出错误:Mockery\Exception\BadMethodCallException

Mac 上安装 php 时出现 Homebrew 错误

WooCommerce 以编程方式添加的费用不会持续存在

按日期向 WooCommerce 中的我的帐户订单添加过滤器

Woocommerce 相关产品按其类别或排名数学主要类别

在 WordPress 中将自定义帖子类型永久链接设置为 root

Laravel 添加到经过身份验证的用户的数据将应用于每个查询

Woocommerce API 的 PHP Curl 附加参数

php preg_match 验证 Tiktok 用户名