【问题标题】:Google Sheets API v.4 for PHP: exclude certain columns from $request适用于 PHP 的 Google Sheets API v.4:从 $request 中排除某些列
【发布时间】:2021-12-09 18:03:01
【问题描述】:

在这个使用 Sheets API 的 Google 表格中,有什么简单的示例可以在请求期间从表格中检索或通过 PHP 显示排除列 B 和 C?

可以从$service 请求中排除 B 列和 C 列吗?

或者,是否可以在 foreach 循环中将 B 列和 C 列排除在显示之外?

使用 R1C1 表示法?还是majorDimension? https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets.values

// Usual suspects
require_once __DIR__ . '/vendor/autoload.php';
$googleAccountKeyFilePath = __DIR__ . '/service_key.json';
putenv('GOOGLE_APPLICATION_CREDENTIALS=' . $googleAccountKeyFilePath);
$client = new Google_Client();
$client->useApplicationDefaultCredentials();
$client->addScope('https://www.googleapis.com/auth/spreadsheets');
$service = new Google_Service_Sheets($client);
$spreadsheetId = '';
$response = $service->spreadsheets->get($spreadsheetId);
$spreadsheetProperties = $response->getProperties();

//The $range where columns could be excluded?

$range = 'Sheet1!A2:I';
$response = $service->spreadsheets_values->get($spreadsheetId, $range);
$values = $response->getValues();

//The foreach loop where columns could be excluded?

foreach($values as $val) {
$valuespan = "<span>".implode('</span> <span>', $val)."</span>";
echo $valuespan;
}

这是现在的输出:

Joe Null blah blah Smith 123 Dogpatch Lane Dog Town Alabama 34567

John Blah Jones 456 猫空心猫镇阿肯色州 12345

Joe Not blah Johns 99 Cow Hollow Cow Town 阿肯色州 12345

我可以排除 B 列和 C 列,以便得到:

乔·史密斯 123 Dogpatch Lane Dog Town 阿拉巴马州 34567

约翰·琼斯 456 猫空心猫镇阿肯色州 12345

Joe Johns 99 Cow Hollow Cow Town 阿肯色州 12345

【问题讨论】:

    标签: php google-sheets google-sheets-api


    【解决方案1】:

    我相信你的目标如下。

    • 您希望从电子表格中检索不包括“B”和“C”列的值。
    • 您希望使用 googleapis for PHP 来实现此目的。
    • 您已经能够使用 Sheets API 从电子表格中获取值。

    在这种情况下,下面的模式怎么样?

    模式一:

    在这个模式中,使用了“spreadsheets.values.get”的方法。首先从“Sheet1!A2:I”中取值,转置取结果值。

    发件人:

    $range = 'Sheet1!A2:I';
    $response = $service->spreadsheets_values->get($spreadsheetId, $range);
    $values = $response->getValues();
    

    收件人:

    $range = 'Sheet1!A2:I';
    $response = $service->spreadsheets_values->get($spreadsheetId, $range);
    $transpose = array_map(null, ...$response->getValues());
    array_splice($transpose, 1, 2);
    $values  = array_map(null, ...$transpose);
    

    模式 2:

    在这个模式中,使用了“spreadsheets.values.batchGet”的方法。首先,从“Sheet1!A2:A”和“Sheet1!D2:I”中检索值,并将检索到的值合并为一个数组。

    发件人:

    $range = 'Sheet1!A2:I';
    $response = $service->spreadsheets_values->get($spreadsheetId, $range);
    $values = $response->getValues();
    

    收件人:

    $response = $service->spreadsheets_values->batchGet($spreadsheetId, array('ranges' => ['Sheet1!A2:A', 'Sheet1!D2:I']));
    $values = [];
    foreach($response['valueRanges'][0]['values'] as $i => $v) {
        array_push($values, array_merge($v, $response['valueRanges'][1]['values'][$i]));
    }
    // In this case, you can retrieve the result values as "$values".
    

    参考资料:

    【讨论】:

    • 谢谢!这两种方法都运作良好。我可以看到两者之间的区别。
    • @BlueDogRanch 感谢您的回复和测试。两种模式都使用一个 API 调用。因此,请根据您的实际情况使用其中一种。
    【解决方案2】:

    根据文档,spreadsheets.get 请求无法从参数中排除定义的范围,只能包含它们。

    相反,您可以使用 spreadsheets.batchGet 请求,以便可以输入多个范围作为参数:

    参数:

    ranges[] 字符串

    要从中检索值的范围的 A1 表示法或 R1C1 表示法。

    示例:

    $ranges = array('Sheet1!A2:A','Sheet1!D2:I');
    $response = $service->spreadsheets_values->batchGet($spreadsheetId, $ranges);
    

    response就是这个对象,你可以在其中遍历ValueRange数组,例如valueRange[i].values得到实际的单元格值。

    {
      "spreadsheetId": string,
      "valueRanges": [
        {
          object (ValueRange)
        }
      ]
    }
    

    其他参考:

    Reading and Writing Values

    【讨论】:

    • 谢谢,我找到了文档,但我正在寻找示例。
    • 添加了一个简单的例子说明如何使用spreadsheets.batchGet
    • 谢谢!越来越近;我收到错误 Uncaught Google\Exception: (batchGet) unknown parameter: '0' in /google/src/Service/Resource.php:153
    猜你喜欢
    • 2021-04-19
    • 2018-11-28
    • 2019-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多