我正在尝试使用这个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
的早期版本
4条答案
按热度按时间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时也可以工作。
设置非交互式身份验证
示例-将数据添加到Google工作表
在Google Sheets上创建一个Google工作表并复制工作表的url。
如果将应用部署到shinyapps.io,请确保将文件部署到
.secrets
文件夹中。qnzebej02#
只需按照this链接中的说明操作即可:
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对我的应用程序进行读写访问。我真的希望有人觉得这个有用。
vybvopom4#
我在开发一个用于数据输入的Shiny应用程序时遇到了类似的问题。这个想法是输入数据并将其自动写入谷歌工作表。我一开始使用这个tutorial,一切都很顺利。然而,当我在shinyapps.io上部署时,我开始发脾气。在检查日志时,我偶然发现了与OP相同的错误消息。
我发现这种方法是错误的,因为我在同一个文件夹中生成了两个非常相似的令牌,这可能会扰乱身份验证(免责声明:我不是开发人员)
经过一番研究,我发现这个googlesheet4 documentation page解释了这一切,其思想是协调身份验证,以避免在只需要一个令牌时生成大量令牌。