4

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経由で認証されている場合、これはすべて機能しますが、ユーザーがスプレッドシートに追加できるようにするにはどうすればよいですか. どのアプローチ/パッケージを使用するかは気にしません。ユーザーが単にソースを見て URL を取得し、手動で編集するのではなく、関数内で使用してスプレッドシートのみを編集できればよいのですが、それはそれほど問題ではありません。

基本的に、スプレッドシート (または他のデータ形式) で R ユーザーからの応答を収集し、新しいユーザーごとに追加できるようにしたいと考えています。

4

3 に答える 3

3

ユーザーは、シートを に登録する必要がありgs_key(YOUR_KEY, lookup = FALSE, visibility = "private")ます。これら 2 つの引数は、2 つの異なる理由で重要です。

  • 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.

ブラウザーで、次の 2 つの操作を行います。
[ファイル] > [Web に公開
] [共有] ボタン > [Web 上で公開] - インターネット上のすべてのユーザーが検索および編集できます

これで、ユーザーは次のように行にアクセスして追加できます。

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?
于 2015-10-26T23:49:40.110 に答える
2

Google スプレッドシートの設定で使用した設定である可能性があります。@jennybryan は、彼女の問題 #126,148 で次のようなことを言及しています。

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

はい、パッケージで同じエラーが発生しますが、ブラウザで表示できます。それも古いシートではありません。ウェブに公開されていることを再確認できますか?Web 上で公開されているだけでは、API アクセスには十分ではありません。これをテストする新しい関数を作成します。区別については、このコメントを参照してください。

126 (コメント)

于 2015-10-26T20:13:10.597 に答える
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)

これは過去に私にとってはうまくいきましたが、うまくいかない場合はお知らせください。

于 2015-10-26T18:49:49.810 に答える