【问题标题】:How to append new data in googlesheet如何在谷歌表格中附加新数据
【发布时间】:2021-03-17 23:39:55
【问题描述】:

我在 R 中有一个下面提到的数据框,我使用 RMySQL 每隔 3 小时从数据库中获取它。

查询:

Select Form_No, Date, Name, Age from Test where Date(Date)>='2020-12-01';

DF:

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 中附加这些额外的条目,除了上次已经上传的五个条目。

【问题讨论】:

    标签: r dataframe google-sheets dplyr r-googlesheets


    【解决方案1】:

    *编辑添加:我现在更了解您的问题了;您只想附加新条目,因为有权访问您的 google 表格的其他人可能已经查看并编辑了以前上传的条目。我的大部分答案都和以前一样。

    尝试使用 googlesheets4 包而不是 googlesheets。

    这对我有用。

    as = gs4_create("TargetSheet")
    DF = as.data.frame(read.csv('cust_data.csv'))
    lastRow = nrow(DF)
    sheet_write(DF, ss = as, sheet = "TargetSheet")
    
    ### 3 Hours later and beyond ###
    
    DF = as.data.frame(read.csv('cust_data.csv'))
    newEntries = DF[(lastRow + 1):nrow(DF), ]
    lastRow = nrow(DF)
    sheet_append(ss = as, data = newEntries, sheet = "TargetSheet")
    

    因此,对于任何其他条目,只需每三个小时运行最后 4 行代码即可。另一种可能的解决方案是根据您之前上传的最后一个已知位置来确定每个新查询,但我认为我的纯 R 解决方案应该可以。

    【讨论】:

      【解决方案2】:

      假设您已将查询保存到名为“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 表格中读取的内容可能不同意确切的时间,因此我建议使用 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
      

      现在您可以使用 sheet_append 将行附加到 Google 表格:

      sheet_append(drive_get("DatabaseOutput"),NewRows)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-03-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多