发送信息到 Google Spreadsheets/Google 表格

Send information to Google Spreadsheets/Google Form

我想使用 Google google 电子表格或表单 + 电子表格来收集 R 用户的回复并将其发送到电子表格。

这是一个最小的 Google 形式:https://docs.google.com/forms/d/1tz2RPftOLRCQrGSvgJTRELrd9sdIrSZ_kxfoFdHiqD4/viewform

以及随附的电子表格:https://docs.google.com/spreadsheets/d/1xemHzTdeqgMuGbsP6oqDYuMu4PymBdw7k7kMC_-Dsi8/edit#gid=102827002

我想我会像这样使用 Jenny Bryan 的 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).

所以在小插图中我看到了分开的地方:

# Need to access a sheet you do not own?
# Access it by key if you know it!

我认为这是允许其他人将数据输入电子表格的门票,所以我尝试了:

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 登录并进行身份验证,这一切都有效,但我怎样才能做到这一点,以便用户可以添加到我的电子表格中。我不在乎 approach/packages 一个人用什么。如果用户只能通过在函数中使用来编辑电子表格,而不是简单地查看源代码并获取 url 并手动编辑,那就太好了,但这不是什么大问题。

本质上,我希望能够以电子表格(或其他数据形式)收集来自 R 用户的回复,并附加到每个新用户。

我已经使用了大量的函数和包,所以我只想说声谢谢。 :)

无论如何,我 运行 遇到了您过去遇到的类似问题,我通过使用此功能解决了这个问题。我基本上只是破解了来自 RGoogleAnalytics 包的 Auth 函数。

# 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)

这在过去对我有用,但如果它不起作用请告诉我。

它可能是您在 Google 表格设置中使用的设置。 @jennybryan 在她的问题 #126,148 中提到了类似的事情:

https://github.com/jennybc/googlesheets/issues/148

OK yes I get same error with the package and yet can view it in the browser. It's is also not an old sheet. Can you double check it is published to the web? Merely being public on the web is not sufficient for API access. I am going to make a new function to test for this! Please see this comment for the distinction:

126 (comment)

您的用户应使用 gs_key(YOUR_KEY, lookup = FALSE, visibility = "private") 注册 Sheet。由于两个不同的原因,这两个论点很重要。

  • lookup = FALSE 允许他们注册 Sheet 即使他们从未在浏览器中访问过。请注意,Sheet 是 "published to the web" 并且他们具有读取权限仍然很重要。
  • visibility = "private" 影响我们为最终添加一行所需的 POST 构建的 URL。要POST,可见性必须是"private",否则会得到https://github.com/jennybc/googlesheets/issues/168.
  • 中报的405错误

我仍然需要将 lookup 信息作为已注册 Google Sheet 对象的一部分,以便下面的示例为 Sheet 的非所有者工作。这意味着您需要从 GitHub.

安装开发版本

要实现您的目标,您的用户还必须具有写入权限。如何实现?最简单但令人讨厌的是使 Sheet 世界可写,如下所示。对于少数人,您可以单独授予权限。我知道没有办法让 Sheet 可以被碰巧拥有密钥的人写入。如果您真的想 "bake in" 将这种权限添加到函数或程序包中,我怀疑您需要找到一种安全的方式来传输令牌,如我最初的评论中所述。

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.

在浏览器中,做两件事:
文件 > 发布到网络
分享按钮 > Public 在网络上 - 互联网上的任何人都可以找到和编辑

现在您的用户可以像这样访问和添加行:

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?