Экранирование знака плюс ( ) в названиях листов

#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, поэтому включение этого должно быть подтверждено).