Отправить информацию в таблицы Google / форму Google
Я хочу использовать электронную таблицу Google Google или форму + электронная таблица, чтобы получить ответ от пользователя R и отправить его в электронную таблицу.
Вот минимальная форма Google: https://docs.google.com/forms/d/1tz2RPftOLRCQrGSvgJTRELrd9sdIrSZ_kxfoFdHiqD4/viewform
И прилагаемая электронная таблица: https://docs.google.com/spreadsheets/d/1xemHzTdeqgMuGbsP6oqDYuMu4PymBdw7k7kMC_-Dsi8/edit
Я думал, что буду использовать пакет googlesheets Дженни Брайан следующим образом:
library(googlesheets);library(dplyr)
(my_sheets <- gs_ls())
minresp <- gs_title("minimal (Responses)")
minresp %>% gs_add_row(ws = "dat", input = mtcars[20, 1:2])
Прекрасно работает, но если я включаю код, и кто-то другой (т.е. кто не я) пытается использовать код:
Error in gs_lookup(., "sheet_title", verbose) :
"minimal (Responsess)" doesn't match sheet_title of any sheet returned by gs_ls() (which should reflect user's Google Sheets home screen).
Так что в виньетке я вижу, что есть отдельно:
# Нужен доступ к листу, которым вы не владеете?
# Доступ к нему по ключу, если вы это знаете!
Я подумал, что это был билет, позволяющий другим вводить данные в электронную таблицу, поэтому я попытался:
minresp2 <- gs_key("1xemHzTdeqgMuGbsP6oqDYuMu4PymBdw7k7kMC_-Dsi8")
получая:
Authentication will be used.
Error in gs_lookup(., "sheet_key", verbose) :
"1xemHzTdeqgMuGbsP6oqDYuMu4PymBdw7k7kMC_-Dsi8" doesn't match sheet_key of any sheet returned by gs_ls() (which should reflect user's Google Sheets home screen).
Это все работает, если я вошел в систему и аутентифицировался через Google, но как я могу сделать это, чтобы пользователи могли добавлять в мою таблицу. Мне все равно, какой подход / пакеты один использует. Было бы хорошо, если бы пользователь мог редактировать таблицу только с помощью функции, а не просто смотреть на источник и получать URL-адрес и редактировать вручную, но это не так важно.
По сути, я хочу иметь возможность собирать ответы от пользователя R в электронную таблицу (или другую форму данных) и добавлять с каждым новым пользователем.
3 ответа
Ваши пользователи должны зарегистрировать лист на gs_key(YOUR_KEY, lookup = FALSE, visibility = "private")
, Эти два аргумента важны по двум различным причинам.
lookup = FALSE
позволяет им зарегистрировать лист, даже если они никогда не посещали в браузере. Обратите внимание, что по-прежнему важно, чтобы лист был "опубликован в Интернете", и у него есть разрешение на чтение.visibility = "private"
влияет на URL, который мы создаем для возможного POST, необходимого для добавления строки. Для POST видимость должна быть "частной", в противном случае вы получите сообщение об ошибке 405, сообщенное на https://github.com/jennybc/googlesheets/issues/168.
Мне все еще нужно было сделать lookup
Информационная часть зарегистрированного объекта Google Sheet для примера ниже, чтобы работать для не владельцев Sheet. Это означает, что вам нужно установить версию для разработчиков из GitHub.
Чтобы достичь цели, ваш пользователь также должен иметь разрешение на запись. Как этого добиться? Самый простой, но отвратительный способ сделать мир листа доступным для записи, как это сделано ниже. Для небольшого количества людей вы можете дать разрешение индивидуально. Я не знаю способа сделать Лист доступным для записи, скажем, людьми, у которых есть ключ. Если вы действительно хотите "вставить" такое разрешение в функцию или пакет, я подозреваю, что вам нужно будет найти безопасный способ передачи токена, как описано в моем исходном комментарии.
ss <- gs_new("add-row-test", input = head(iris))
#> Sheet "add-row-test" created in Google Drive.
#> Range affected by the update: "A1:E7"
#> Worksheet "Sheet1" successfully updated with 35 new value(s).
#> Worksheet dimensions: 1000 x 26.
В браузере сделайте две вещи:
Файл> Опубликовать в Интернете
Кнопка "Поделиться"> "Публичная в Интернете" - любой человек в Интернете может найти и изменить
Теперь ваши пользователи могут получать доступ и добавлять строки следующим образом:
ss_key <- "114cXPTe9whThS3lmpa3neY2vplpUX1hcnM8o8Oo6QtM"
add_row_result <- ss_key %>%
gs_key(lookup = FALSE, visibility = "private") %>%
gs_add_row(input = c("can", "you", "hear", "me", "now?"))
#> Authorization will not be used.
#> Worksheets feed constructed with private visibility
#> Row successfully appended.
add_row_result %>%
gs_read()
#> Accessing worksheet titled "Sheet1"
#> Source: local data frame [9 x 5]
#>
#> Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#> (chr) (chr) (chr) (chr) (chr)
#> 1 5.1 3.5 1.4 0.2 setosa
#> 2 4.9 3 1.4 0.2 setosa
#> 3 4.7 3.2 1.3 0.2 setosa
#> 4 4.6 3.1 1.5 0.2 setosa
#> 5 5 3.6 1.4 0.2 setosa
#> 6 5.4 3.9 1.7 0.4 setosa
#> 7 can you hear me now?
Это может быть параметр, который вы использовали в настройках Google Sheets. @jennybryan упоминает что-то подобное в своем выпуске №126,148 ниже:
https://github.com/jennybc/googlesheets/issues/148
ОК, да, я получаю ту же ошибку с пакетом и все же могу просмотреть его в браузере. Это тоже не старый лист. Можете ли вы проверить, опубликовано ли это в Интернете? Одной лишь публичности в Интернете недостаточно для доступа к API. Я собираюсь сделать новую функцию, чтобы проверить это! Пожалуйста, смотрите этот комментарий для различия:
Я использовал кучу ваших функций и пакетов, так что я просто хочу сказать спасибо.:)
В любом случае, я столкнулся с подобной проблемой, с которой вы сталкивались в прошлом, и я обошел ее, используя эту функцию. Я просто взломал Auth
функция, которая исходит от RGoogleAnalytics
пакет.
# client id and secret for google drive ####
client.secret <- "YOUR SECRET"
client.id <- "YOUR ID"
# auth function to get at files in google drive ####
# and implementing it
Auth <- function(client.id,client.secret) {
require(httr)
myapp <- oauth_app("google", client.id,
client.secret)
google.token <- oauth2.0_token(oauth_endpoints("google"), myapp,
scope = "https://www.googleapis.com/auth/drive.file")
return(google.token)
}
token <- Auth(client.id,
client.secret)
Это работало для меня в прошлом, но дайте мне знать, если это не сработает.