2015-10-26 45 views
4

我想使用谷歌Google电子表格或表格+电子表格来收集R用户的回复并将其发送到电子表格。将信息发送到Google Spreadsheets/Google表单

下面是一个最小的谷歌形式:https://docs.google.com/forms/d/1tz2RPftOLRCQrGSvgJTRELrd9sdIrSZ_kxfoFdHiqD4/viewform

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

我想我会用珍妮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用户的数据(或其他数据形式)的响应并附加到每个新用户。

+0

是否愿意让任何人都可以写该表单?你可以通过使用'gs_key(...,lookup = FALSE)'来解决re:lookup上面的错误。但是,你的下一个更大的问题将以有针对性的方式给予写入许可。 AFAIK你不能让一张纸可写,比如碰巧有一把钥匙的人。我想知道这个包https://github.com/hadley/secure是否可以用来安全地向用户提供OAuth2令牌? – jennybryan

+0

@jennybryan我认为我可以允许它是可写的,但这并不理想 –

+0

对我来说工作正常 - 我首先必须运行'gs_auth()',然后我在A7中添加了测试:'minresp2 < - gs_key ( “1xemHzTdeqgMuGbsP6oqDYuMu4PymBdw7k7kMC_-Dsi8”); minresp2 < - minresp2%>%gs_edit_cells(input = c(“test”),anchor =“A7”,byrow = TRUE)' – jeremycg

回答

3

您的用户应该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安装开发版本。

要实现您的目标,您的用户还必须具有写入权限。如何实现这一目标?最简单但很可惜的是让Sheet世界可写,如下所示。对于少数人,您可以单独授予权限。我知道没有办法让一张表可以写入,比如碰巧有钥匙的人。如果你真的想将这种权限“烘烤”成一个函数或包,我怀疑你需要找到一种安全的方式来传输一个令牌,正如我原来的评论中所描述的那样。

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? 
+1

这表明你没有从GitHub重新安装? – jennybryan

+0

正确。错过了。 –

1

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

无论如何,我遇到了类似的问题,你有过去,我用我的方式通过使用这个函数的方式。我基本上只是黑客来自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) 

这在过去对我有用,但让我知道如果它不起作用。

+0

但'googlesheets :: gs_auth()'已经接受用户指定的密钥/其论据。它们也可以通过'.Rprofile'设置为全局选项。所以我不确定为什么需要解决方法。 – jennybryan

+0

嗨jennybryan ...虽然我不记得我当时正在遇到的确切问题......我记得在通过RStudio运行脚本,通过批处理文件运行时间表以及设置工作目录。我敢肯定,这是我的一个疏忽,但黑客的方式解决了我的问题。感谢您在包装上的所有工作。这让我的生活变得更轻松! :) – maloneypatr

+0

好的。希望非交互式使用的新小插曲使这个更清晰:https://cdn.rawgit.com/jennybc/googlesheets/master/vignettes/managing-auth-tokens.html – jennybryan

2

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

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

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

126 (comment)

+0

就是这样。错过了。当我尝试添加一行时,现在我收到了一个新错误...但是这让我经历了这一步:https:// github。com/jennybc/googlesheets/issues/168 –