Доступ к листу Google (новый стиль, общедоступный) как JSON

Как я могу получить доступ к содержимому (нового стиля) листа Google JSON? Моя цель - получить доступ к значениям из JavaScript, поэтому мне нужно иметь возможность загружать JSON через HTTP.

Пример: как загрузить данные с этого листа в виде JSON?

Я попытался найти ответ через веб-поиск, но в итоге не удалось:

Ответ 1

Я наконец (вроде) решил свою проблему. Просто для справок в будущем, и в случае, если кто-то другой столкнется с теми же проблемами, вот решение, которое я придумал:

  1. Чтобы сделать рабочий лист общедоступным, необходимо сделать рабочий лист общедоступным. Это делается в веб-интерфейсе Google Таблиц, используя записи меню File > Publish to the web... > link > publish. Можно опубликовать всю электронную таблицу или отдельные рабочие листы.

  2. API для доступа к данным из Google Таблиц программно описан на веб-страницах API Google Таблиц. Этот API использует URLS формы https://spreadsheets.google.com/feeds/.../ key / worksheetId /... Чуть странно, значение ключа и workheetId, похоже, не объясняется в документации API.

    Мои эксперименты показывают, что ключевое значение можно найти, приняв участие в URL-адресах, используемых для доступа к листу через веб-интерфейс (см. Также здесь). Ключом является все после /d/, до следующего косая черта. Для электронной таблицы в вопросе ключ, таким образом, является 1mhv1lpzufTruZhzrY-ms0ciDVKYiFJLWCMpi4OOuqvI. Рабочий листId кажется целочисленным, что дает положение рабочего листа в электронной таблице. Для примера в вопросе нужно знать, что показанный лист является вторым листом, рабочий лист имеет в этом случае 2.

    API определяет public и private запросы. Чтобы получить доступ к экспортированному ресурсу без проверки подлинности, должны использоваться public запросы.

  3. Вызовы API для получения данных из электронной таблицы объясняются в разделе "Получение фида на основе списка" (щелкните на вкладке "Протокол" в примерах). Требуется URL-адрес, чтобы извлечь данные из электронной таблицы в вопросе.

    https://spreadsheets.google.com/feeds/list/1mhv1lpzufTruZhzrY-ms0ciDVKYiFJLWCMpi4OOuqvI/2/public/full

    HTTP-запрос GET для этого URL-адреса возвращает эти данные как XML. (Я не нашел способ получить данные как JSON.)

  4. Обычная защита снова вызывает запросы на межсайтовый сайт, что затрудняет доступ к данным через вызовы JavaScript XML RPC в веб-приложении. Один из способов решения этой проблемы - проксировать вызовы API через веб-сервер (например, с помощью директивы nginx proxy_pass).

Вышеуказанные шаги - это, по крайней мере, частичное решение проблемы в вопросе. Единственная трудность состоит в том, что данные возвращаются как XML, а не как JSON. Поскольку в документации API не упоминается JSON, возможно, больше невозможно извлечь данные в этом формате?

Ответ 2

Если вы хотите использовать новейший API (v4), вам необходимо сделать следующее:

  1. Создайте ключ API электронных таблиц (см. Инструкции ниже).
  2. Сделайте ваш лист общедоступным.
  3. Используйте запрос формы:

    https://sheets.googleapis.com/v4/spreadsheets/SPREADSHEET_ID/values/RANGE?key=API_KEY
    

Затем вы получите чистый ответ JSON:

{
  "range": "Sheet1!A1:D5",
  "majorDimension": "ROWS",
  "values": [
    ["Item", "Cost", "Stocked", "Ship Date"],
    ["Wheel", "$20.50", "4", "3/1/2016"],
    ["Door", "$15", "2", "3/15/2016"],
    ["Engine", "$100", "1", "30/20/2016"],
    ["Totals", "$135.5", "7", "3/20/2016"]
  ],
}

Обратите внимание, что если вы хотите указать все содержимое страницы, то идентификатор, такой как Sheet1, абсолютно корректен.

Дополнительную информацию см. В разделе " Основное чтение".


Начиная с v4 API, все запросы должны сопровождаться идентификатором (например, ключом API):

Запросы API Google Таблиц для общедоступных данных должны сопровождаться идентификатором, который может быть ключом API или токеном доступа.

Следуйте инструкциям связанного документа, чтобы создать ключ API на странице учетных данных.

Убедись в:

  1. Создайте новое приложение на Google Cloud Platform.
  2. Создайте новый ключ API.
  3. Добавьте API Google Таблиц. (API-менеджер> Dashboard> Enable API)

Обратите внимание, что вы все равно можете получать доступ к общедоступным данным, не заставляя пользователя входить в систему:

В новом листе API v4 нет явного объявления видимости. Вызовы API выполняются с использованием идентификаторов таблиц. Если у приложения нет разрешения на доступ к указанной электронной таблице, возвращается ошибка. В противном случае вызов продолжается.

Обратите внимание, что вам не нужно публиковать лист в Интернете. Все, что вам нужно сделать, это убедиться, что любой, у кого есть ссылка, может получить доступ к листу.

(Т.е. когда вы нажимаете Создать учетные данные в API-интерфейсе Google Таблиц, выберите "Другие не-пользовательские интерфейсы", "Пользовательские данные", и в нем говорится: "Пользовательские данные не могут быть доступны с платформы без пользовательского интерфейса, поскольку для этого требуется взаимодействие с пользователем для входа". безопасно игнорировать это сообщение. Ключ API - это все, что вам действительно нужно, поскольку это общедоступные данные.)


Общие сообщения об ошибках:

В запросе отсутствует действительный ключ API.

Вы не включили key= param в свой звонок.

Неверный ключ API. Отправьте действительный ключ API. Консоль разработчиков Google

Вы указали неправильный ключ API. Убедитесь, что вы набрали свой ключ правильно. Если у вас еще нет ключа, перейдите в консоль разработчиков Google и создайте его.

Ключ API не найден. Отправьте действительный ключ API.
Ключ API консоли разработчика Google

Ваш API-ключ, вероятно, правильный, но вы, скорее всего, не добавили разрешение Google Таблиц. Перейдите на страницу ключа API консоли разработчика Google и добавьте права на листы.

У вызывающего абонента нет разрешения

Ваш лист не установлен для общедоступного доступа.

Ответ 3

Здесь, как получить JSON, используя те же параметры URL:

"https://spreadsheets.google.com/feeds/list/" + spreadsheetID + "/od6/public/values?alt=json";

Кредиты для @jochen в ответе с путём вплоть до XML "https://spreadsheets.google.com/feeds/list/" + spreadsheetID + "/od6/public/" + sheetID;

Как объясняет @jochen answer, этот sheetID основан на порядке листов в электронной таблице.

Ответ 4

Более быстрым решением здесь является использование этого https://gist.github.com/ronaldsmartin/47f5239ab1834c47088e для обертывания вокруг существующей электронной таблицы.

Сначала вам нужно изменить доступ к листу Anyone with link can View

Добавьте параметр id и sheet html в URL-адрес ниже.

https://script.google.com/macros/s/AKfycbzGvKKUIaqsMuCj7-A2YRhR-f7GZjl4kSxSN1YyLkS01_CfiyE/exec

Например: ваш id - это id вашего листа, который

1mhv1lpzufTruZhzrY-ms0ciDVKYiFJLWCMpi4OOuqvI

и ваш лист, который

Sheet2

В вашем случае вы можете увидеть ваши данные здесь как json at

https://script.google.com/macros/s/AKfycbzGvKKUIaqsMuCj7-A2YRhR-f7GZjl4kSxSN1YyLkS01_CfiyE/exec?id=1mhv1lpzufTruZhzrY-ms0ciDVKYiFJLWCMpi4OOuqvI&sheet=Sheet2

Чтобы быть в безопасности, вы должны развернуть sheetAsJson.gs в github gist выше как свой собственный на своем Google Диске.