我想使用Google google电子表格或表单+电子表格来收集R用户的回复并将其发送到speadsheet。
以下是最小的Google表单:https://docs.google.com/forms/d/1tz2RPftOLRCQrGSvgJTRELrd9sdIrSZ_kxfoFdHiqD4/viewform
我以为我会像这样使用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用户的回复,并附加给每个新用户。
答案 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访问。我要做一个新功能来测试这个! 请参阅此评论以区分:
答案 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)
这在过去对我有用,但如果它不起作用,请告诉我。