Copies a (work)sheet, within its current (spread)Sheet or to another Sheet.

  from_sheet = NULL,
  to_ss = from_ss,
  to_sheet = NULL,
  .before = NULL,
  .after = NULL



Something that identifies a Google Sheet: its file ID, a URL from which we can recover the ID, an instance of googlesheets4_spreadsheet (returned by gs4_get()), or a dribble, which is how googledrive represents Drive files. Processed through as_sheets_id().


Sheet to copy, in the sense of "worksheet" or "tab". You can identify a sheet by name, with a string, or by position, with a number. Defaults to the first visible sheet.


The Sheet to copy to. Accepts all the same types of input as from_ss, which is also what this defaults to, if unspecified.


Optional. Name of the new sheet, as a string. If you don't specify this, Google generates a name, along the lines of "Copy of blah". Note that sheet names must be unique within a Sheet, so if the automatic name would violate this, Google also de-duplicates it for you, meaning you could conceivably end up with "Copy of blah 2". If you have better ideas about sheet names, specify to_sheet.

.before, .after

Optional specification of where to put the new sheet. Specify, at most, one of .before and .after. Refer to an existing sheet by name (via a string) or by position (via a number). If unspecified, Sheets puts the new sheet at the end.


The receiving Sheet, to_ ss, as an instance of sheets_id.

See also

If the copy happens within one Sheet, makes a DuplicateSheetRequest:

If the copy is from one Sheet to another, wraps the spreadsheets.sheets/copyTo endpoint:

and possibly makes a subsequent UpdateSheetPropertiesRequest:

Other worksheet functions: sheet_add(), sheet_append(), sheet_delete(), sheet_properties(), sheet_relocate(), sheet_rename(), sheet_resize(), sheet_write()


if (gs4_has_token()) { ss_aaa <- gs4_create( "sheet-copy-demo-aaa", sheets = list(iris = head(iris), chickwts = head(chickwts)) ) # copy 'iris' sheet within existing Sheet, accept autogenerated name ss_aaa %>% sheet_copy() # copy 'iris' sheet within existing Sheet # specify new sheet's name and location ss_aaa %>% sheet_copy(to_sheet = "iris-the-sequel", .after = 1) # make a second Sheet ss_bbb <- gs4_create("sheet-copy-demo-bbb") # copy 'chickwts' sheet from first Sheet to second # accept auto-generated name and default location ss_aaa %>% sheet_copy("chickwts", to_ss = ss_bbb) # copy 'chickwts' sheet from first Sheet to second, # WITH a specific name and into a specific location ss_aaa %>% sheet_copy( "chickwts", to_ss = ss_bbb, to_sheet = "chicks-two", .before = 1 ) # clean up gs4_find("sheet-copy-demo") %>% googledrive::drive_trash() }
#> Creating new Sheet: "sheet-copy-demo-aaa"
#> Request failed [429]. Retry 1 happens in 100.4 seconds ...
#> Duplicating sheet "iris" in "sheet-copy-demo-aaa"
#> Copied as "Copy of iris"
#> Duplicating sheet "Copy of iris" in "sheet-copy-demo-aaa"
#> Copied as "iris-the-sequel"
#> Creating new Sheet: "sheet-copy-demo-bbb"
#> Copying sheet "chickwts" from "sheet-copy-demo-aaa" to "sheet-copy-demo-bbb"
#> Copied as "Copy of chickwts"
#> Copying sheet "chickwts" from "sheet-copy-demo-aaa" to "sheet-copy-demo-bbb"
#> Copied as "chicks-two"
#> Files trashed: #> * sheet-copy-demo-bbb: 1UEAzHd4ruZrDVjmPrGG_-LkKT9BeYrwdckcmDPLNdJc #> * sheet-copy-demo-aaa: 1AGsd4lvR8e4a8gKROQM_FBtXlgvqhzRDd7U2s92etKQ