You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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)

代码功能说明

  1. 核心需求实现

    • 数据存入Google Sheets:通过googlesheets4包的sheet_append(追加数据)和gs4_create(创建新表格)函数,将selectInput和numericInput的内容写入指定表格,自动记录交易时间
    • 个人表格链接支持:通过textInput接收用户的Google Sheets链接,直接作为读写操作的目标地址
    • 输入框重置:提交成功后,用updateSelectInput和updateNumericInput重置交易类型和金额输入框,保留用户的表格链接
    • 历史数据展示:用DT包生成交互式表格,提交数据或点击刷新按钮时自动读取并展示最新的交易记录
  2. 关键细节处理

    • 加入错误捕获逻辑,处理表格不存在、链接无效或权限不足的情况,弹出提示通知
    • 首次运行应用会自动引导用户完成Google账号授权,需授予应用读写表格的权限
    • 交易时间自动生成,无需用户手动输入
  3. 使用注意事项

    • 确保目标Google Sheets设置了可编辑权限(至少对授权的Google账号开放)
    • 若遇到授权问题,可运行gs4_deauth()清除现有授权后重新启动应用

内容的提问来源于stack exchange,提问作者MaxTRules

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 16:40:29