使用 Google 电子表格 API 获取通过过滤器视图过滤的值
Use Google Spreadsheet API to obtain values filtered by Filter view
我正在尝试使用 Google 表格 API(在 PHP 中使用 google/apiclient 和 OAuth 2.0)从电子表格中获取数据。
此电子表格定义了一些“过滤视图”(在数据 > 过滤视图中定义),例如其中一个过滤器仅显示价格列大于 x 的行。
我试图找到一种方法来使用现有的筛选视图之一获取已筛选的数据,但我找不到。有什么办法吗?
虽然我不确定您的问题中的当前脚本,但不幸的是,当您想使用过滤器视图从 sheet 中检索过滤值时,在当前阶段没有任何方法直接实现它。因此,在这种情况下,需要使用变通方法。解决方法的流程如下。
此解决方法的流程:
- 检索您要使用的过滤器视图 (
filterViews
) 的设置。
- 此时可以使用“spreadsheets.get”的方法
- 使用检索到的过滤器视图设置,为您要使用的 sheet 创建新的基本过滤器。
- 此时可以使用“spreadsheets.batchUpdate”的方法
- 检索 sheet 的
rowMetadata
的值。
- 此时可以使用“spreadsheets.get”的方法
- 在
rowMetadata
的值处,筛选出的行的 属性 为 "hiddenByFilter": true,
。使用它,您可以检索隐藏行 and/or 显示行。
- 删除创建的基本过滤器。
通过上面的流程,可以检索过滤后的值。
示例脚本:
当您已经能够使用 Sheets API 和 googleapis for PHP 获取和放置 Google Spreadsheet 的值时,作为上述示例脚本解决方法,您可以使用以下脚本。
$service = new Google_Service_Sheets($client); // Please use $client from your script.
$spreadSheetId = '###'; // Please set the Spreadsheet ID.
$sheetName = 'Sheet1'; // Please set the sheet name.
$filterViewName = 'sampleFilter1'; // Please set the filter view name.
// 1. Retrieve the settings of the filter view (`filterViews`) you want to use.
$sheets = $service->spreadsheets->get($spreadSheetId, ["ranges" => [$sheetName], "fields" => "sheets"])->getSheets();
$sheetId = $sheets[0]->getProperties()->getSheetId();
$filterViews = $sheets[0]->getFilterViews();
$filterView = array();
foreach ($filterViews as $i => $f) {
if ($f->getTitle() == $filterViewName) {
array_push($filterView, $f);
};
};
if (count($filterView) == 0) return;
// 2. Create new basic filter to the sheet you want to use using the retrieved settings of the filter view.
$obj = $filterView[0];
$obj['range']['sheetId'] = $sheetId;
$requests = [
new Google_Service_Sheets_Request(['clearBasicFilter' => ['sheetId' => $sheetId]]),
new Google_Service_Sheets_Request([
'setBasicFilter' => [
'filter' => [
'criteria' => $obj['criteria'],
'filterSpecs' => $obj['filterSpecs'],
'range' => $obj['range'],
'sortSpecs' => $obj['sortSpecs'],
]
]
])
];
$batchUpdateRequest = new Google_Service_Sheets_BatchUpdateSpreadsheetRequest(['requests' => $requests]);
$service->spreadsheets->batchUpdate($spreadSheetId, $batchUpdateRequest);
// 3. Retrieve the values of `rowMetadata` of the sheet.
$sheets = $service->spreadsheets->get($spreadSheetId, ["ranges" => [$sheetName], "fields" => "sheets"])->getSheets();
$rowMetadata = $sheets[0]->getData()[0]->getRowMetadata();
$filteredRows = array(
'hiddenRows' => array(),
'showingRows' => array()
);
foreach ($rowMetadata as $i => $r) {
if (isset($r['hiddenByFilter']) && $r['hiddenByFilter'] === true) {
array_push($filteredRows['hiddenRows'], $i + 1);
} else {
array_push($filteredRows['showingRows'], $i + 1);
};
};
// 4. Delete the created basic filter.
$requests = [new Google_Service_Sheets_Request(['clearBasicFilter' => ['sheetId' => $sheetId]])];
$batchUpdateRequest = new Google_Service_Sheets_BatchUpdateSpreadsheetRequest(['requests' => $requests]);
$service->spreadsheets->batchUpdate($spreadSheetId, $batchUpdateRequest);
print($filteredRows);
结果:
当上面的脚本用于以下示例时 Spreadsheet,
未设置过滤视图之前。
设置过滤视图后。
结果值
从上面的Spreadsheet,得到下面的结果。
{
"hiddenRows": [2, 3, 5, 6, 8, 9],
"showingRows": [1, 4, 7, 10, 11, 12, 13, 14, 15]
}
hiddenRows
是隐藏的行号。
showingRows
是 showingRows 行号。
注:
- 重要提示: 在这个示例脚本中,当在 sheet 中使用基本过滤器时,基本过滤器被清除。请注意这一点。当您测试这个脚本时,请使用示例 Spreadsheet.
- 在此示例脚本中,检索隐藏行和显示行。使用这些值,您可以检索过滤后的值。
参考文献:
- Method: spreadsheets.get
- Method: spreadsheets.batchUpdate
- 相关线程。
- 此线程适用于 Google Apps 脚本。不幸的是,我找不到用于此的 PHP 脚本。所以我添加了示例脚本。
我正在尝试使用 Google 表格 API(在 PHP 中使用 google/apiclient 和 OAuth 2.0)从电子表格中获取数据。
此电子表格定义了一些“过滤视图”(在数据 > 过滤视图中定义),例如其中一个过滤器仅显示价格列大于 x 的行。
我试图找到一种方法来使用现有的筛选视图之一获取已筛选的数据,但我找不到。有什么办法吗?
虽然我不确定您的问题中的当前脚本,但不幸的是,当您想使用过滤器视图从 sheet 中检索过滤值时,在当前阶段没有任何方法直接实现它。因此,在这种情况下,需要使用变通方法。解决方法的流程如下。
此解决方法的流程:
- 检索您要使用的过滤器视图 (
filterViews
) 的设置。- 此时可以使用“spreadsheets.get”的方法
- 使用检索到的过滤器视图设置,为您要使用的 sheet 创建新的基本过滤器。
- 此时可以使用“spreadsheets.batchUpdate”的方法
- 检索 sheet 的
rowMetadata
的值。- 此时可以使用“spreadsheets.get”的方法
- 在
rowMetadata
的值处,筛选出的行的 属性 为"hiddenByFilter": true,
。使用它,您可以检索隐藏行 and/or 显示行。
- 删除创建的基本过滤器。
通过上面的流程,可以检索过滤后的值。
示例脚本:
当您已经能够使用 Sheets API 和 googleapis for PHP 获取和放置 Google Spreadsheet 的值时,作为上述示例脚本解决方法,您可以使用以下脚本。
$service = new Google_Service_Sheets($client); // Please use $client from your script.
$spreadSheetId = '###'; // Please set the Spreadsheet ID.
$sheetName = 'Sheet1'; // Please set the sheet name.
$filterViewName = 'sampleFilter1'; // Please set the filter view name.
// 1. Retrieve the settings of the filter view (`filterViews`) you want to use.
$sheets = $service->spreadsheets->get($spreadSheetId, ["ranges" => [$sheetName], "fields" => "sheets"])->getSheets();
$sheetId = $sheets[0]->getProperties()->getSheetId();
$filterViews = $sheets[0]->getFilterViews();
$filterView = array();
foreach ($filterViews as $i => $f) {
if ($f->getTitle() == $filterViewName) {
array_push($filterView, $f);
};
};
if (count($filterView) == 0) return;
// 2. Create new basic filter to the sheet you want to use using the retrieved settings of the filter view.
$obj = $filterView[0];
$obj['range']['sheetId'] = $sheetId;
$requests = [
new Google_Service_Sheets_Request(['clearBasicFilter' => ['sheetId' => $sheetId]]),
new Google_Service_Sheets_Request([
'setBasicFilter' => [
'filter' => [
'criteria' => $obj['criteria'],
'filterSpecs' => $obj['filterSpecs'],
'range' => $obj['range'],
'sortSpecs' => $obj['sortSpecs'],
]
]
])
];
$batchUpdateRequest = new Google_Service_Sheets_BatchUpdateSpreadsheetRequest(['requests' => $requests]);
$service->spreadsheets->batchUpdate($spreadSheetId, $batchUpdateRequest);
// 3. Retrieve the values of `rowMetadata` of the sheet.
$sheets = $service->spreadsheets->get($spreadSheetId, ["ranges" => [$sheetName], "fields" => "sheets"])->getSheets();
$rowMetadata = $sheets[0]->getData()[0]->getRowMetadata();
$filteredRows = array(
'hiddenRows' => array(),
'showingRows' => array()
);
foreach ($rowMetadata as $i => $r) {
if (isset($r['hiddenByFilter']) && $r['hiddenByFilter'] === true) {
array_push($filteredRows['hiddenRows'], $i + 1);
} else {
array_push($filteredRows['showingRows'], $i + 1);
};
};
// 4. Delete the created basic filter.
$requests = [new Google_Service_Sheets_Request(['clearBasicFilter' => ['sheetId' => $sheetId]])];
$batchUpdateRequest = new Google_Service_Sheets_BatchUpdateSpreadsheetRequest(['requests' => $requests]);
$service->spreadsheets->batchUpdate($spreadSheetId, $batchUpdateRequest);
print($filteredRows);
结果:
当上面的脚本用于以下示例时 Spreadsheet,
未设置过滤视图之前。
设置过滤视图后。
结果值
从上面的Spreadsheet,得到下面的结果。
{
"hiddenRows": [2, 3, 5, 6, 8, 9],
"showingRows": [1, 4, 7, 10, 11, 12, 13, 14, 15]
}
hiddenRows
是隐藏的行号。showingRows
是 showingRows 行号。
注:
- 重要提示: 在这个示例脚本中,当在 sheet 中使用基本过滤器时,基本过滤器被清除。请注意这一点。当您测试这个脚本时,请使用示例 Spreadsheet.
- 在此示例脚本中,检索隐藏行和显示行。使用这些值,您可以检索过滤后的值。
参考文献:
- Method: spreadsheets.get
- Method: spreadsheets.batchUpdate
- 相关线程。
- 此线程适用于 Google Apps 脚本。不幸的是,我找不到用于此的 PHP 脚本。所以我添加了示例脚本。