#google-sheets-api
#google-sheets-api
Вопрос:
У нас есть электронная таблица Google с именем листа, похожим на foo bar (yay)
. Когда я пытаюсь выбрать данные из листа с помощью Java API, я получаю сообщение об ошибке от Google со словами:
{
"code" : 400,
"errors" : [ {
"domain" : "global",
"message" : "Unable to parse range: foo bar (yay)!A2:Z",
"reason" : "badRequest"
} ],
"message" : "Unable to parse range: foo bar (yay)!A2:Z",
"status" : "INVALID_ARGUMENT"
}
Код выглядит примерно так (некоторые детали аутентификации исключены и переведены из Scala)
Sheets s = ... // constructed using HTTP transport amp; credentials
String range = "'foo bar (yay)'!A2:Z";
String spreadsheetId = ... // fill in your own
ValueRange values = s.spreadsheets().values().get(spreadsheetId, range).execute();
Это основано на следующем примере кода: https://developers.google.com/sheets/api/quickstart/java#step_3_set_up_the_sample
Обратите внимание, что
был заменен одним пробелом
, как если бы он был закодирован в URL. Я попытался заменить
на +
, но я все еще получаю ошибку, и она повторяется +
мне, как будто я имел в виду буквально «% 2B» — так что я не думаю, что это вопрос кодировки URL.
Я попытался перечислить названия листов для этой электронной таблицы, и я получаю обратно
знак в названии листа, так что я не думаю, что это проблема. Затем я попытался переименовать лист, чтобы использовать слово «и» вместо
, и мой код смог успешно выбрать диапазон — таким образом, я почти уверен, что
проблема. Я не вижу никакого описания экранирования специальных символов в документации.
Я заметил это в документации: https://developers.google.com/sheets/api/guides/concepts#a1_notation и попытался заключить название листа в одинарные кавычки ( "'foo bar (yay)'"
), но безрезультатно.
Есть ли какой-нибудь способ, которым я могу выбрать этот диапазон без переименования листа?
Комментарии:
1. Чтобы правильно понять вашу ситуацию, можете ли вы предоставить свой скрипт для воспроизведения проблемы? Потому что из вашего вопроса я не могу понять о
https://developers.google.com/sheets/api/guides/concepts#a1_notation and tried surrounding the sheet name with single quotes, but to no avail.
. Например, в моей среде я мог бы подтвердить, что при'foo bar (yay)'!A1
использовании метода «spreadsheets.values.get» в Sheets API ошибки не возникает и возвращается правильное значение.2. Безусловно, необходима дополнительная информация — а также код, запрошенный Tanaike, какой метод API вы вызываете?
Try This API
Функция работает без проблем .3. Обновлено примерами кода
4. Какую библиотеку Scala вы используете? Это может быть артефактом используемой вами библиотеки, поскольку у API, похоже, нет проблем с этим символом в названии листа.
5. Я использую библиотеки Java, предоставляемые Google. Единственный приведенный здесь код Scala — мой собственный. Библиотека Java, которую я использую, является
com.google.apis:google-api-services-sheets:v4-rev612-1.25.0
Ответ №1:
я столкнулся с той же ошибкой — также используя библиотеки Java и пытаясь ссылаться на лист с именем «Неделя 1 2» .. я попробовал идею «Неделя 1 2″!A2: Z», но java это не понравилось. затем я попробовал «‘Week1 2’!A2: Z», и он скомпилировался, но получил ошибку «Невозможно проанализировать диапазон ‘Week 1 2′». это похоже (как кто-то указал) на то, что ‘ ‘ переводится в пробел. Я видел в другом месте, что у кого-то тоже была проблема с — в имени?
** ЭТО НЕ ОТВЕТ!!! пытался добавить в качестве комментария к выше, но это не позволяет мне**
интересный факт -> я протестировал библиотеку python для чтения листа, и она довольно успешно принимает имя листа со встроенным . так что, похоже, это особенность Java….
Ответ №2:
Наконец-то это заработало.
Когда имя листа используется в вызове API в качестве ДИАПАЗОНА, например sheets.googleapis.com/v4/spreadsheets/{sheetID}/values/SHEET_NAME_AS_RANGE?key={key}
, хитрость заключается в том, чтобы НЕ заключать имя диапазона в одинарные кавычки и использовать encodeURIComponent в имени листа.
Так, например, лист с именем NY / POINTS AndSpace Здесь будет кодироваться как NY/POINTS+AndSpace Here и выглядеть примерно так в примере, который я привел:
sheets.googleapis.com/v4/spreadsheets/{sheetID}/values/NY/POINTS+AndSpace Here?key={key}
Это должно означать, что операционная система сможет использовать следующее:
String sheetName = "foo bar (yay)"
String range = encodeURIComponent(sheetName) "!A2:Z"
(Я тестировал это только с использованием самого имени листа в качестве диапазона, не включая часть A2: Z, поэтому включение этого должно быть подтверждено).