通过带有googlesheets4的R中的shiny连接到googlesheets

5hcedyr0  于 2023-02-26  发布在  Go
关注(0)|答案(4)|浏览(120)

我正在尝试使用这个example的更新版本通过shiny连接到一个私人googlesheet,并在www.example.com服务器上部署这个应用程序shinyapps.io,由于这个应用程序使用的是一个预先存在的googlesheet,所以用户不需要通过google帐户的验证。
我已经按照这个example(部分复制在这里),试图保存令牌到我的闪亮的应用程序:

# previous googlesheets package version:
shiny_token <- gs_auth() # authenticate w/ your desired Google identity here
saveRDS(shiny_token, "shiny_app_token.rds")

但试图更新到googlesheets4,就像这样:

ss <- gs4_get("MY GOOGLE DOC URL") # do the authentication once, manually.
ss
gs4_has_token() # check that the token exists

# get token
ss_token <- gs4_token()
# save the token
save(ss_token, file = "APP PATH ... /data/tk.rdata")

然后在应用程序中,我将此代码放在shinyApp()函数之外。

load("data/tk.rdata")

googlesheets4::gs4_auth(token = ss_token, use_oob = T)

在应用程序中,我使用从上面的ss$spreadsheet_id获得的硬编码id从应用程序连接到一个google doc,应用程序在本地工作。
在尝试将应用程序部署到服务器后,我收到错误消息“...无法获取google凭据。您是否正在非交互式会话中运行googlesheets4?...等”我认为令牌将包含足够的信息。
如果有人能给我一个设置这个的指南,并评论一下这种方法(在www.example.com上保存一个令牌)是否安全,我将不胜感激shinyapps.io。
我看过其他示例,但似乎大多数都是针对googlesheets的早期版本

jrcvhitl

jrcvhitl1#

2021年7月21日,谷歌表单4 deprecated some of its function when releasing v1.0.0
我已经更新了volfi's answer来使用googlesheets 4 v1.0.0。
它在部署到shinyapps.io时也可以工作。

设置非交互式身份验证

library(googlesheets4)
    
# Set authentication token to be stored in a folder called `.secrets`
options(gargle_oauth_cache = ".secrets")

# Authenticate manually
gs4_auth()

# If successful, the previous step stores a token file.
# Check that a file has been created with:
list.files(".secrets/")

# Check that the non-interactive authentication works by first deauthorizing:
gs4_deauth()

# Authenticate using token. If no browser opens, the authentication works.
gs4_auth(cache = ".secrets", email = "your@email.com")

示例-将数据添加到Google工作表

Google Sheets上创建一个Google工作表并复制工作表的url。

library(googlesheets4)
gs4_auth(cache=".secrets", email="your@email.com")

ss <- gs4_get("https://docs.google.com/path/to/your/sheet")
sheet_append(ss, data.frame(time=Sys.time()))

如果将应用部署到shinyapps.io,请确保将文件部署到.secrets文件夹中。

qnzebej0

qnzebej02#

只需按照this链接中的说明操作即可:

# designate project-specific cache
options(gargle_oauth_cache = ".secrets")
# check the value of the option, if you like
gargle::gargle_oauth_cache()
# trigger auth on purpose to store a token in the specified cache
# a broswer will be opened
googlesheets4::sheets_auth()
# see your token file in the cache, if you like
list.files(".secrets/")
# sheets reauth with specified token and email address
sheets_auth(
 cache = ".secrets",
 email = "youremail"
 )
a8jjtwal

a8jjtwal3#

我在这里发帖是因为我从这个线程开始了这个旅程,并希望分享什么最终工作后,许多小时的尝试,阅读漱口水,googledrive,和googlesheets 4文档和哦,这么多其他职位对这个问题。
1.我第一次使用googlesheets 4方法gs4_auth()来获取一个凭证,并将其存储在.secrets文件夹中。如本线程和here中所述。这在我的桌面上工作,我很兴奋。它在shinyapps.io或我在AWS EC2示例上的shiny-server的Ubuntu 18.4示例上不工作。错误如下:
“错误在...:无法获取Google凭据。您是否正在非交互式会话中运行googledrive?请考虑:drive_deauth()以防止尝试获取凭据。请直接调用drive_auth()并提供所有必要的详细信息。”
1.然后我尝试了一种方法,从here开始,把我带到这里。不知何故,这在www.example.com上确实有效shinyapps.io,但在我的Ubuntu闪亮的服务器上仍然无效。
1.**这起作用了:**我采用了这里描述的Google服务帐户方法,创建了一个项目,然后是项目的服务帐户,将Google Sheets API添加到项目中,然后下载了一个JSON文件形式的密钥。然后我在app_server.R文件的顶部使用了googlesheets4::gs4_auth(path = './<path to hidden JSON file folder I called .token>/.token/<JSON key file>.json')。这仍然没有起作用,直到最后一步,几乎在我查看的任何地方都没有清楚地解释,那就是转到有问题的Google工作表,并与JSON密钥文件中的client_email电子邮件地址“共享”它,在我的情况下,赋予它编辑权限。这最终在这篇随机文章中得到了很好的解释:https://robocorp.com/docs/development-guide/google-sheets/interacting-with-google-sheets
最后从我的AWS服务器示例上的Shiny Server对我的应用程序进行读写访问。我真的希望有人觉得这个有用。

vybvopom

vybvopom4#

我在开发一个用于数据输入的Shiny应用程序时遇到了类似的问题。这个想法是输入数据并将其自动写入谷歌工作表。我一开始使用这个tutorial,一切都很顺利。然而,当我在shinyapps.io上部署时,我开始发脾气。在检查日志时,我偶然发现了与OP相同的错误消息。
我发现这种方法是错误的,因为我在同一个文件夹中生成了两个非常相似的令牌,这可能会扰乱身份验证(免责声明:我不是开发人员)

# WRONG!

# interactive, generates token
options(gargle_oauth_cache = ".secrets")
googledrive::drive_auth()
googlesheets4::gs4_auth()

# non-interactive
googledrive::drive_auth(cache = ".secrets", email = "blabla@email.com")
googlesheets4::gs4_auth(cache = ".secrets", email = "blabla@email.com")

经过一番研究,我发现这个googlesheet4 documentation page解释了这一切,其思想是协调身份验证,以避免在只需要一个令牌时生成大量令牌。

# RIGHT!

# interactive, generates token
options(gargle_oauth_cache = ".secrets")
googledrive::drive_auth()

# non-interactive
googledrive::drive_auth(cache = ".secrets", email = "blabla@email.com")
googlesheets4::gs4_auth(token = drive_token())

相关问题