r - 如何在 googlesheet 中追加新数据
问题描述
我在 R 中有一个下面提到的数据框,我RMySQL
每隔 3 小时从数据库中获取它。
询问:
Select Form_No, Date, Name, Age from Test where Date(Date)>='2020-12-01';
东风:
Form_No Date Name Age
POS-1 2020-12-01 10:16:12 Alex 29
POS-2 2020-12-01 10:18:34 Mike 31
POS-3 2020-12-01 14:16:22 Paul 21
POS-4 2020-12-01 18:33:14 John 27
POS-5 2020-12-01 20:13:34 Cohe 45
忘记了,在我运行脚本每 3 小时后,可能会在数据框中创建一些额外的条目,当我使用下面提到的代码在 googlesheet 中上传数据时,它会覆盖以前的信息并更新新数据。
问题在于,对于每一行,信息的审阅者可能已经捕获了一些观察结果。
我使用的代码是:
library(dplyr)
library(stringr)
library(RMySQL)
library(googlesheets)
connection<-dbConnect(MySQL(), user='User', password='Password',
dbname='Db name',
host='host info')
Query<- paste0("Select Form_No, Date, Name, Age from Test where Date(Date)>='2020-12-01';")
DF <- dbGetQuery(connection,Query)
setwd("/home/path")
write.csv(x = DF, file = "cust_data.csv", row.names = FALSE)
as<-gs_title("TargetSheet")
gs_upload("cust_data.csv", sheet_title = "TargetSheet", overwrite = TRUE)
我想在上传新一批信息时保持 Form_No 的顺序和每个细节相同。
例如,如果我在上午 06:00 运行了查询,并且有五个条目,如图所示,DF
并且所有这些条目都上传到了谷歌表,那么现在如果我在上午 09:00 运行脚本,那么在我的查询中就有可能除了这五个条目之外,还有更多条目。
我现在需要在 google sheet 中附加这些额外的条目,除了上次已经上传的五个条目。
解决方案
假设您已将查询保存到名为“DatabaseOutput”的 Google 表格中:
您可以使用 读取数据googlesheets4::read_sheet
。为了确保您每次都获得正确的列类型,我建议提供col_types =
参数。read_sheet
返回与 SQL 查询返回的列类型相同的列类型非常重要。readr
您可以在文档页面上找到有关该参数的更多信息。
library(googledrive)
library(googlesheets4)
OldSheet <- read_sheet(drive_get("DatabaseOutput"),
col_types = "cTci")
OldSheet
## A tibble: 3 x 4
# Form_No Date Name Age
# <chr> <dttm> <chr> <dbl>
#1 POS-1 2020-12-01 10:16:12 Alex 29
#2 POS-2 2020-12-01 10:18:34 Mike 31
#3 POS-3 2020-12-01 14:16:22 Paul 21
您的 SQL 查询和从 Google 表格中读取的内容可能不同意确切的时间,因此我建议在 Date 列中添加以下内容lubridate
:
library(dplyr)
library(lubridate)
DF <- as_tibble(DF) %>%
mutate(Date = as_datetime(floor(seconds(Date))))
OldSheet <- OldSheet %>%
mutate(Date = as_datetime(floor(seconds(Date))))
现在我们可以找到不在旧数据中的行dplyr::anti_join
。如果这不起作用,请仔细检查列类型是否都相同。
NewRows <- anti_join(DF,OldSheet)
NewRows
## A tibble: 2 x 4
# Form_No Date Name Age
# <chr> <dttm> <chr> <int>
#1 POS-4 2020-12-01 18:33:14 John 27
#2 POS-5 2020-12-01 20:13:34 Cohe 45
现在您可以使用以下命令将行附加到 Google 表格sheet_append
:
sheet_append(drive_get("DatabaseOutput"),NewRows)
推荐阅读
- node.js - “TypeError:res.sendFile 不是函数”
- regex - Ruby正则表达式捕获两个字符串之间的部分内容
- apache-kafka - 我可以使用 Lambda 函数中的 AWS MSK kafka 主题吗?
- python - 如何创建 to_sql create_engine
- python - 熊猫 | 替代 lambda 函数 => .loc[row_indexer,col_indexer] = value
- azure-devops - azure-devops 管道测试通过报告使用错误的数学
- angular - 来自 Font Awesome 的一些图标
- javascript - 异步等待不会停止
- javascript - 将数据插入到 2 个单独的 mySQL 表中
- java - 我需要将活动“暂停”以使搜索功能正常工作