2015-10-26 69 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 –