【问题标题】:Send information to Google Spreadsheets/Google Form将信息发送到 Google 电子表格/Google 表单
【发布时间】:2016-01-25 23:47:42
【问题描述】:

我想使用 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).

所以在小插曲中我看到了不同的地方:

# 需要访问不属于您的工作表吗?
# 如果您知道,请通过密钥访问它!

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

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

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

【问题讨论】:

  • 您是否愿意让任何人都可以写入工作表?您可以通过使用gs_key(..., lookup = FALSE) 来解决上面的错误:查找。但是您的下一个更大的问题将是有针对性地授予写入权限。 AFAIK 你不能让一个工作表可写,比如说,碰巧有钥匙的人。我想知道这个包github.com/hadley/secure 是否可以用来安全地向您的用户提供 OAuth2 令牌?
  • @jennybryan 我想我可以让它是可写的,但这并不理想
  • 它对我来说很好用 - 我首先必须运行 gs_auth() 然后我刚刚在 A7 中添加了测试:minresp2 &lt;- gs_key("1xemHzTdeqgMuGbsP6oqDYuMu4PymBdw7k7kMC_-Dsi8"); minresp2 &lt;- minresp2 %&gt;% gs_edit_cells(input = c("test"), anchor = "A7", byrow = TRUE)

标签: r google-sheets r-googlesheets


【解决方案1】:

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

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

我仍然需要将lookup 信息作为已注册 Google 表格对象的一部分,以便下面的示例适用于表格的非所有者。这意味着您需要从 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?

【讨论】:

  • 这说明你还没有从 GitHub 重新安装?
  • 正确。错过了。
【解决方案2】:

这可能是您在 Google 表格设置中使用的设置。 @jennybryan 在下面的第 126,148 期中提到了类似的事情:

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

好的,是的,我收到与包相同的错误,但可以在 浏览器。它也不是一张旧的床单。你能仔细检查一下吗 发布到网络?仅仅在网络上公开是不够的 用于 API 访问。我将创建一个新功能来测试这个! 请参阅此评论以了解区别:

126 (comment)

【讨论】:

【解决方案3】:

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

无论如何,我遇到了与您过去遇到的类似问题,我通过使用此功能解决了这个问题。我基本上只是破解了来自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)

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

【讨论】:

  • 但googlesheets::gs_auth() 已经通过其参数接受用户指定的密钥/ID 和秘密。它们也可以通过.Rprofile 全局设置为选项。所以我不确定为什么需要解决方法。
  • 嘿 jennybryan...虽然我不记得我当时遇到的确切问题...我记得通过 RStudio 运行脚本之间存在一些脱节,通过一个批处理文件,并设置工作目录。我敢肯定这是我的疏忽,但是被黑的方式解决了我的问题。不过,感谢您在包装上所做的所有工作。它让我的生活变得轻松多了! :)
  • 好的。希望关于非交互式使用的新小插曲能更清楚地说明这一点:cdn.rawgit.com/jennybc/googlesheets/master/vignettes/…
猜你喜欢
  • 2014-02-01
  • 2014-09-11
  • 1970-01-01
  • 1970-01-01
  • 2014-09-14
  • 1970-01-01
  • 2022-06-10
  • 2019-12-14
  • 1970-01-01
相关资源
最近更新 更多