Как можно написать на общедоступном листе Google (без авторизации) в Python? - PullRequest
2 голосов
/ 28 апреля 2020

У меня есть полный доступ к редактированию Google Sheet, который мне не принадлежит. Я хочу иметь возможность писать в электронную таблицу, используя Python без авторизации Google API. Я проверил несколько доступных пакетов (gdata, gspread et c.) И, кажется, все они запрашивают учетные данные.

Я также смог прочитать содержимое электронной таблицы без авторизации, используя requests или pd.read_csv() pandas (я изменил URL, изменив последнюю часть, говоря ... edit#gid= ... на ... export?format=csv&gid= ...). Однако при отправке запроса POST на тот же URL-адрес я получил 200 кодов состояния, но ту же старую пустую электронную таблицу.

Любая помощь очень важна.

1 Ответ

2 голосов
/ 29 апреля 2020

Я считаю, что ваша цель заключается в следующем.

  • Вы хотите поместить значения в общедоступную электронную таблицу Google, используя python.
  • В этом случае вы хотите получить доступ к в электронную таблицу без авторизации.

Для этого, как насчет этого ответа?

Проблема и обходной путь:

Чтобы поместить значения в общедоступный Google Электронная таблица, используется метод POST. В этом случае необходимо использовать токен доступа. С другой стороны, в случае метода GET, когда используется API Sheets, можно использовать ключ API. И конечные точки, такие как exportLinks, вы можете получить значения без ключа API. Это спецификация стороны Google.

В этих условиях, для достижения вашей цели, я хотел бы предложить следующие 2 шаблона.

Шаблон 1:

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

Пример сценария:

import gspread
from oauth2client.service_account import ServiceAccountCredentials

spreadsheetId = "###"  # Please set the Spreadsheet ID.

scope = ['https://www.googleapis.com/auth/spreadsheets']
credentials = ServiceAccountCredentials.from_json_keyfile_name('credentials.json', scope)
client = gspread.authorize(credentials)
spreadsheet = client.open_by_key(spreadsheetId)
worksheet = spreadsheet.sheet1
worksheet.update_acell('A1', 'sample')
  • В этом примере сценария sample помещается в ячейку "A1" первого вкладка в общедоступной электронной таблице с использованием gspread.

Pattern 2:

В этом шаблоне я хотел бы предложить доступ к электронной таблице с помощью веб-приложений, созданных скриптом Google Apps в качестве оболочки API. В этом случае сценарий python становится проще.

Использование:

Пожалуйста, выполните следующую последовательность действий.

1. Создайте новый проект скрипта Google Apps.

Пример скрипта веб-приложений - это скрипт Google Apps. Поэтому, пожалуйста, создайте проект Google Apps Script.

Если вы хотите создать его напрямую, перейдите к https://script.new/. В этом случае, если вы не вошли в Google, откроется экран входа. Пожалуйста, войдите в Google. При этом открывается редактор сценариев Google Apps Script.

2. Подготовьте скрипт.

Скопируйте и вставьте следующий скрипт (Google Apps Script) в редактор скриптов. И , пожалуйста, включите Google Sheets API в Advanced Google services . Этот сценарий предназначен для веб-приложений.

function doPost(e) {
  try {
    const spreadsheetId = e.parameter.spreadsheetId;
    const obj = JSON.parse(e.postData.contents);
    const resource = obj.body;
    const range = obj.arguments.range;
    const valueInputOption = obj.arguments.valueInputOption;
    Sheets.Spreadsheets.Values.update(resource, spreadsheetId, range, {valueInputOption: valueInputOption});
    return ContentService.createTextOutput("ok");
  } catch(e) {
    return ContentService.createTextOutput(JSON.stringify(e));
  }
}
  • В этом случае используется метод POST.
  • В этом примере сценария, в качестве сценария тестирования, ставятся значения в электронную таблицу с использованием метода spreadsheets.values.update в API листов.

3. Развертывание веб-приложений.

  1. В редакторе сценариев откройте диалоговое окно с помощью «Publi sh» -> «Развернуть как веб-приложение».
  2. Выберите «Me " for " Запустите приложение как: ".
    • При этом сценарий запускается от имени владельца.
  3. Выберите "Любой, даже анонимный" для "У кого есть доступ к приложению: ".
    • В этом случае токен доступа не требуется запрашивать. Я думаю, что я рекомендую этот параметр для вашей цели.
    • Конечно, вы также можете использовать токен доступа. В это время установите «Anyone» .
  4. Нажмите кнопку «Развернуть» как новую «Project version».
  5. Автоматически открывать диалоговое окно «Требуется авторизация».
    1. Нажмите «Просмотреть разрешения».
    2. Выберите собственную учетную запись.
    3. Нажмите «Дополнительно» в разделе «Это приложение не подтверждено».
    4. Нажмите " Go to ### имя проекта ### (небезопасно) "
    5. Нажмите кнопку" Разрешить ".
  6. Нажмите" ОК ".
  7. Скопируйте URL-адрес веб-приложений. Это как https://script.google.com/macros/s/###/exec.
    • Когда вы изменили скрипт Google Apps, пожалуйста, повторно разверните его как новую версию. Этим измененный сценарий отражается в веб-приложениях. Пожалуйста, будьте осторожны.

4. Запустите функцию с помощью веб-приложений.

Это пример сценария python для запроса веб-приложений. Установите URL-адрес веб-приложения, идентификатор электронной таблицы и диапазон.

import json
import requests

spreadsheet_id = '###'  # Please set the Spreadsheet ID.
body = {
    "arguments": {"range": "Sheet1!A1", "valueInputOption": "USER_ENTERED"},
    "body": {"values": [["sample"]]}
}
url = 'https://script.google.com/macros/s/###/exec?spreadsheetId=' + spreadsheet_id
res = requests.post(url, json.dumps(body), headers={'Content-Type': 'application/json'})
print(res.text)
  • В этом примере сценария sample помещается в ячейку "A1" на 1-й вкладке в общедоступной электронной таблице.
  • В этом случае авторизация в сценарии python не требуется, поскольку она уже была выполнена при развертывании веб-приложений.

Примечание:

  • При изменении сценария веб-приложений повторно разверните веб-приложения как новую версию. Таким образом, последний скрипт отражается в веб-приложениях. Пожалуйста, будьте осторожны.

Ссылки:

...