上一行填充后,使用gs_edit_cells递增到新行

时间:2019-01-09 16:02:30

标签: r google-sheets shiny

我正在制作一个闪亮的应用程序,充当访客计数器。它需要用户从操作按钮输入,然后使用值表(日期,学期,游戏,计数)更新Googlesheet。我可以填充输入的第一个值,但是我不确定如何“递增” gs_edit_cells(),因为它只能让我指定一个特定的锚点单元格。

我尝试使用gs_add_row(),但是它与输入的尺寸不一致,因为它说输入的值必须为0?我一直在这里搜寻,因为这似乎应该解决个琐碎的问题。

服务器:

变量数据的格式

data <- c("date","semester","games","num")

saveData <- function(data) {
  # Grab the google sheet
  table <- gs_title("Game_Table")

  show(data)
  gs_edit_cells(ss = table, 
                ws = 1, 
                input = data,
                anchor = "A1", 
                byrow = TRUE, 
                col_names = FALSE, 
                trim = TRUE)
}

该表的第一个单元格按预期更新:

17905 Fall Table Tennis 7

但是当我再次运行它时,它会覆盖旧数据。

1 个答案:

答案 0 :(得分:0)

您可以使用gs_add_row()gs_edit_cells()添加新行,但是在两种情况下,您以前都必须至少添加一行和标题(例如,使用gs_edit_cells())。在您的情况下,它们由于各种原因而无法工作:

1。 gs_add_row

该函数的文档规定:

  

此功能目前仅在具有适当的变量或列名标题行且至少有一个预先存在的数据行的工作表中起作用。

在您的情况下,此操作不起作用可能是因为您的电子表格没有标题。一种解决方案是在使用gs_edit_cells()之前使用gs_add_row()创建第一行和标题信息。

2。 gs_edit_cells

您在anchor = "A1"中使用了gs_edit_cells(),因此每次从单元格A1更新电子表格时(因此,将覆盖以前的内容)。解决方案是读取电子表格的当前内容,以了解行数,并指定需要在不覆盖过去内容的情况下开始更新的单元格(请注意,标头填充电子表格中的一行)。

示例代码(包括两种解决方案):

data <- data.frame(date = 17905, semester = "Fall", games = "Table Tennis", num = 7)
new_data <- data.frame(date = 17905, semester = "Fall", games = "Table Tennis", num = 7)

# Grab the google sheet
table <- gs_title("Game_Table")

# save first row of data with header (run only one time)
gs_edit_cells(ss = table, 
              ws = 1, 
              input = data,
              anchor = "A1", 
              byrow = TRUE, 
              trim = TRUE)

# solution 1: add new rows with gs_add_rows
table <- gs_title("Game_Table")
gs_add_row(ss = table, input = new_data)

# solution 2: add new rows with gs_edit_cells
table <- gs_title("Game_Table")
last_row <- nrow(gs_read(table))
gs_edit_cells(ss = table, 
              ws = 1, 
              input = new_data,
              anchor = paste0("A",last_row+2), 
              byrow = TRUE, 
              col_names = FALSE, 
              trim = TRUE)