如何在R Shiny中收集用户输入并存储至Google Sheets?
Shiny 结合 googlesheets4 实现用户输入存储到个人Google Sheets的完整方案
前置依赖安装
首先安装所需的R包:
install.packages(c("shiny", "googlesheets4", "DT", "dplyr"))
完整示例代码
library(shiny) library(googlesheets4) library(DT) library(dplyr) # UI部分 ui <- fluidPage( titlePanel("交易数据录入与历史查看"), sidebarLayout( sidebarPanel( # 支持输入个人Google Sheets链接 textInput("sheet_url", "你的Google Sheets链接", placeholder = "例如:https://docs.google.com/spreadsheets/d/xxxxxx..."), selectInput("transaction_type", "交易类型", choices = c("收入", "支出", "转账")), numericInput("amount", "交易金额", value = 0, min = 0), actionButton("submit_btn", "提交数据"), actionButton("refresh_btn", "刷新历史数据") ), mainPanel( # 展示交易历史数据表 DTOutput("transaction_table") ) ) ) # Server部分 server <- function(input, output, session) { # 反应式变量存储交易历史数据 transaction_data <- reactiveVal(NULL) # 提交数据逻辑 observeEvent(input$submit_btn, { # 校验必填输入项 req(input$sheet_url, input$transaction_type, input$amount) # 构造待存储的数据行 new_row <- tibble( 交易时间 = Sys.time(), 交易类型 = input$transaction_type, 金额 = input$amount ) tryCatch({ # 尝试读取现有表格,存在则追加数据 existing_data <- read_sheet(input$sheet_url) sheet_append(input$sheet_url, new_row) }, error = function(e) { # 表格不存在时创建新表格并写入初始数据 gs4_create(input$sheet_url, sheets = list(交易记录 = new_row)) }) # 重置交易类型和金额输入框 updateSelectInput(session, "transaction_type", selected = "") updateNumericInput(session, "amount", value = 0) # 自动刷新历史数据 refresh_data() }) # 刷新历史数据函数 refresh_data <- function() { req(input$sheet_url) tryCatch({ # 读取Google Sheets数据并更新反应式变量 data <- read_sheet(input$sheet_url) transaction_data(data) }, error = function(e) { showNotification("无法读取指定的Google Sheets,请检查链接或权限", type = "error") transaction_data(NULL) }) } # 点击刷新按钮触发数据刷新 observeEvent(input$refresh_btn, { refresh_data() }) # 渲染交易历史表格 output$transaction_table <- renderDT({ req(transaction_data()) datatable(transaction_data(), options = list(pageLength = 10, language = list(url = '//cdn.datatables.net/plug-ins/1.10.25/i18n/Chinese.json')), rownames = FALSE) }) } # 启动Shiny应用 shinyApp(ui, server)
代码功能说明
核心需求实现
- 数据存入Google Sheets:通过
googlesheets4包的sheet_append(追加数据)和gs4_create(创建新表格)函数,将selectInput和numericInput的内容写入指定表格,自动记录交易时间 - 个人表格链接支持:通过
textInput接收用户的Google Sheets链接,直接作为读写操作的目标地址 - 输入框重置:提交成功后,用
updateSelectInput和updateNumericInput重置交易类型和金额输入框,保留用户的表格链接 - 历史数据展示:用
DT包生成交互式表格,提交数据或点击刷新按钮时自动读取并展示最新的交易记录
- 数据存入Google Sheets:通过
关键细节处理
- 加入错误捕获逻辑,处理表格不存在、链接无效或权限不足的情况,弹出提示通知
- 首次运行应用会自动引导用户完成Google账号授权,需授予应用读写表格的权限
- 交易时间自动生成,无需用户手动输入
使用注意事项
- 确保目标Google Sheets设置了可编辑权限(至少对授权的Google账号开放)
- 若遇到授权问题,可运行
gs4_deauth()清除现有授权后重新启动应用
内容的提问来源于stack exchange,提问作者MaxTRules
相关产品推荐
相关产品推荐

