将信息发送到Google电子表格/ Google表单

时间:2015-10-26 18:38:11

标签: r google-sheets r-googlesheets

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

以下是最小的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).

如果我通过谷歌登录并进行身份验证,这一切都有效,但我怎么能这样做,以便用户可以添加到我的电子表格中。我不关心使用什么方法/包。如果用户只能通过函数中的使用来编辑spreasheet,而不是简单地查看源代码并获取url并手动编辑,那就太好了。但是这不是一个问题。

基本上我希望能够在一个传播数据集(或其他数据形式)中收集来自R用户的回复,并附加给每个新用户。

3 个答案:

答案 0 :(得分:3)

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

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

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

要实现目标,您的用户还必须具有写入权限。怎么实现呢?最简单但令人讨厌的是让Sheet世界变得可写,如下所示。对于少数人,您可以单独授予许可。我知道没有办法让那些碰巧有钥匙的人可以写一张纸。如果你真的想要&#34;烘烤&#34;这种对函数或包的权限,我怀疑你需要找到一种传输令牌的安全方式,如我原来的评论所述。

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.

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

现在,您的用户可以访问和添加如下行:

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?

答案 1 :(得分:2)

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

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

  

好的是我在包中遇到同样的错误,但可以在包中查看   浏览器。它也不是一张旧纸。你能仔细检查吗?   发布到网上?仅仅在网上公开是不够的   用于API访问。我要做一个新功能来测试这个!   请参阅此评论以区分:

     

126 (comment)

答案 2 :(得分:1)

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

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

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