Я создал электронную таблицу Google Sheets с двумя таблицами, которые называются Sheet1
и Sheet2
:
https://docs.google.com/spreadsheets/d/1P1WH7cwVDaG6k-OQxKVXtnjBXI1NGFYvHD6IxCRFsZc/edit?usp=sharing
Sheet1
, имеет столбцы col1
и col2
в строке 1, а Sheet2
имеет столбцы col3
и col4
в строке 1.
Я хотел бы иметь возможность запрашивать оба листа, используя интерфейс командной строки bigQuery.Кажется, что это было невозможно до недавнего добавления новой функции в мае 2018 года:
https://issuetracker.google.com/issues/35905674#comment12
Я пытался воспроизвести то, что описывает этот комментарий, но не могу заставить его работать.Вот что я сделал до сих пор:
Описание новой функции показывает пример google_sheets_tabeledef.json
, который выглядит следующим образом:
{
"autodetect": false,
"sourceFormat": "GOOGLE_SHEETS",
"sourceUris": [
"https://docs.google.com/spreadsheets/d/xxxxxxxxxxxxxx"
],
"maxBadRecords": 1,
"googleSheetsOptions":
{
"range": "test_sheet!A1:B20",
"skipLeadingRows": 0
},
"schema" : {
"fields": [
{
"name": "col1",
"type": "string"
},
{
"name": "col2",
"type": "int64"
},
]
}
}
Учитывая мою электронную таблицу с двумя листами, Sheet1
и Sheet2
, я создал соответствующие таблицы в моей учетной записи bigQuery, затем попытался запросить каждую из них через командную строку bq query
.Это работает, как показано для Sheet1
:
bq query --format=csv --use_legacy_sql=false 'SELECT * FROM `cegx-test-project1.multi_sheet_test.Sheet1`' 2>/dev/null
col1,col2
col1,col2
foo,bar
abc,def
И если я попробую то же самое для Sheet2
, в отсутствие external_table_definition, он показывает:
bq query --format=csv --use_legacy_sql=false 'SELECT * FROM `cegx-test-project1.multi_sheet_test.Sheet2`' 2>/dev/null
col3,col4
col1,col2
foo,bar
abc,def
Так что это в основномвозвращается к первому рабочему листу вместо запроса Sheet2
.Итак, как и ожидалось.
Затем я создал эквивалентный google_sheets_sheet2_tabledef.json
файл, подобный следующему:
{
"autodetect": true,
"sourceFormat": "GOOGLE_SHEETS",
"sourceUris": [
"https://docs.google.com/spreadsheets/d/1P1WH7cwVDaG6k-OQxKVXtnjBXI1NGFYvHD6IxCRFsZc"
],
"maxBadRecords": 1,
"googleSheetsOptions":
{
"range": "Sheet2!A1:B10",
"skipLeadingRows": 0
},
"schema" : {
"fields": [
{"name":"col3","type":"string"},
{"name":"col4","type":"string"}
]
}
}
Обратите внимание, что в параметре range
я указываю на Sheet2!A1:B10
.
Если я попытаюсь снова запросить таблицу, теперь с флагом external_table_definition я получу:
bq query --external_table_definition="Sheet2::/tmp/google_sheets_sheet2_tabledef.json" --format=csv --use_legacy_sql=false 'SELECT * FROM `cegx-test-project1.multi_sheet_test.Sheet2`' 2>/dev/null
col3,col4
col1,col2
foo,bar
abc,def
Так что я все равно получаю результаты из Sheet1
даже с внешним файлом определенияуказывая на диапазон в Sheet2
.
Есть идеи, где проблема?