{"version":3,"sources":["../src/lib/utils.ts","../src/lib/GoogleSpreadsheetRow.ts","../src/lib/GoogleSpreadsheetCellErrorValue.ts","../src/lib/GoogleSpreadsheetCell.ts","../src/lib/GoogleSpreadsheetWorksheet.ts","../src/lib/GoogleSpreadsheet.ts"],"names":["groupBy","each","values","isBoolean","isString","isFinite","isNil","keys","get","isEqual","unset","set","some","pickBy","flatten","compact","filter","isArray","map","isObject","times","isInteger","ky","sortBy","keyBy","omit","find"],"mappings":"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","file":"index.cjs","sourcesContent":["import * as _ from './toolkit';\n\nexport function getFieldMask(obj: Record<string, unknown>) {\n  let fromGrid = '';\n  const fromRoot = Object.keys(obj).filter((key) => key !== 'gridProperties').join(',');\n\n  if (obj.gridProperties) {\n    fromGrid = Object.keys(obj.gridProperties).map((key) => `gridProperties.${key}`).join(',');\n    if (fromGrid.length && fromRoot.length) {\n      fromGrid = `${fromGrid},`;\n    }\n  }\n  return fromGrid + fromRoot;\n}\n\nexport function columnToLetter(column: number) {\n  let temp;\n  let letter = '';\n  let col = column;\n  while (col > 0) {\n    temp = (col - 1) % 26;\n    letter = String.fromCharCode(temp + 65) + letter;\n    col = (col - temp - 1) / 26;\n  }\n  return letter;\n}\n\nexport function letterToColumn(letter: string) {\n  let column = 0;\n  const { length } = letter;\n  for (let i = 0; i < length; i++) {\n    column += (letter.charCodeAt(i) - 64) * 26 ** (length - i - 1);\n  }\n  return column;\n}\n\nexport function checkForDuplicateHeaders(headers: string[]) {\n  // check for duplicate headers\n  const checkForDupes = _.groupBy(headers); // { c1: ['c1'], c2: ['c2', 'c2' ]}\n  _.each(checkForDupes, (grouped, header) => {\n    if (!header) return; // empty columns are skipped, so multiple is ok\n    if (grouped.length > 1) {\n      throw new Error(`Duplicate header detected: \"${header}\". Please make sure all non-empty headers are unique`);\n    }\n  });\n}\n\n","import { GoogleSpreadsheetWorksheet } from './GoogleSpreadsheetWorksheet';\nimport { columnToLetter } from './utils';\n\n\n// TODO: add type for possible row values (currently any)\n\nexport class GoogleSpreadsheetRow<T extends Record<string, any> = Record<string, any>> {\n  constructor(\n    /** parent GoogleSpreadsheetWorksheet instance */\n    readonly _worksheet: GoogleSpreadsheetWorksheet,\n    /** the A1 row (1-indexed) */\n    private _rowNumber: number,\n    /** raw underlying data for row */\n    private _rawData: any[]\n  ) {\n\n  }\n\n  private _deleted = false;\n  get deleted() { return this._deleted; }\n\n  /** row number (matches A1 notation, ie first row is 1) */\n  get rowNumber() { return this._rowNumber; }\n  /**\n   * @internal\n   * Used internally to update row numbers after deleting rows.\n   * Should not be called directly.\n  */\n  _updateRowNumber(newRowNumber: number) {\n    this._rowNumber = newRowNumber;\n  }\n  get a1Range() {\n    return [\n      this._worksheet.a1SheetName,\n      '!',\n      `A${this._rowNumber}`,\n      ':',\n      `${columnToLetter(this._worksheet.headerValues.length)}${this._rowNumber}`,\n    ].join('');\n  }\n\n  /** get row's value of specific cell (by header key) */\n  get(key: keyof T) {\n    const index = this._worksheet.headerValues.indexOf(key as string);\n    return this._rawData[index];\n  }\n  /** set row's value of specific cell (by header key) */\n  set<K extends keyof T>(key: K, val: T[K]) {\n    const index = this._worksheet.headerValues.indexOf(key as string);\n    this._rawData[index] = val;\n  }\n  /** set multiple values in the row at once from an object */\n  assign(obj: Partial<T>) {\n    // eslint-disable-next-line no-restricted-syntax, guard-for-in\n    for (const key in obj) this.set(key, obj[key] as any);\n  }\n\n  /** return raw object of row data */\n  toObject() {\n    const o: Partial<T> = {};\n    for (let i = 0; i < this._worksheet.headerValues.length; i++) {\n      const key: keyof T = this._worksheet.headerValues[i];\n      if (!key) continue;\n      o[key] = this._rawData[i];\n    }\n    return o;\n  }\n\n  /** save row values */\n  async save(options?: { raw?: boolean }) {\n    if (this._deleted) throw new Error('This row has been deleted - call getRows again before making updates.');\n\n    const response = await this._worksheet._spreadsheet.sheetsApi.put(`values/${encodeURIComponent(this.a1Range)}`, {\n      searchParams: {\n        valueInputOption: options?.raw ? 'RAW' : 'USER_ENTERED',\n        includeValuesInResponse: true,\n      },\n      json: {\n        range: this.a1Range,\n        majorDimension: 'ROWS',\n        values: [this._rawData],\n      },\n    });\n    const data = await response.json<any>();\n    this._rawData = data.updatedData.values[0];\n  }\n\n  /** delete this row */\n  async delete() {\n    if (this._deleted) throw new Error('This row has been deleted - call getRows again before making updates.');\n\n    const result = await this._worksheet._makeSingleUpdateRequest('deleteRange', {\n      range: {\n        sheetId: this._worksheet.sheetId,\n        startRowIndex: this._rowNumber - 1, // this format is zero indexed, because of course...\n        endRowIndex: this._rowNumber,\n      },\n      shiftDimension: 'ROWS',\n    });\n    this._deleted = true;\n    this._worksheet._shiftRowCache(this.rowNumber);\n\n    return result;\n  }\n\n  /**\n   * @internal\n   * Used internally to clear row data after calling sheet.clearRows\n   * Should not be called directly.\n  */\n  _clearRowData() {\n    for (let i = 0; i < this._rawData.length; i++) {\n      this._rawData[i] = '';\n    }\n  }\n}\n","import { CellValueErrorType, ErrorValue } from './types/sheets-types';\n\n/**\n * Cell error\n *\n * not a js \"error\" that gets thrown, but a value that holds an error code and message for a cell\n * it's useful to use a class so we can check `instanceof`\n\n * @see https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/other#ErrorType\n */\nexport class GoogleSpreadsheetCellErrorValue {\n  /**\n   * type of the error\n   * @see https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/other#ErrorType\n   * */\n  readonly type: CellValueErrorType;\n\n  /** A message with more information about the error (in the spreadsheet's locale) */\n  readonly message: string;\n\n  constructor(rawError: ErrorValue) {\n    this.type = rawError.type;\n    this.message = rawError.message;\n  }\n}\n","/* eslint-disable max-classes-per-file */\nimport * as _ from './toolkit';\n\nimport { columnToLetter } from './utils';\n\nimport { GoogleSpreadsheetWorksheet } from './GoogleSpreadsheetWorksheet';\nimport { GoogleSpreadsheetCellErrorValue } from './GoogleSpreadsheetCellErrorValue';\n\nimport {\n  CellData,\n  CellFormat, CellValueType, ColumnIndex, RowIndex,\n} from './types/sheets-types';\n\nexport class GoogleSpreadsheetCell {\n  private _rawData?: CellData;\n  private _draftData: any = {};\n  private _error?: GoogleSpreadsheetCellErrorValue;\n\n  constructor(\n    readonly _sheet: GoogleSpreadsheetWorksheet,\n    private _rowIndex: RowIndex,\n    private _columnIndex: ColumnIndex,\n    rawCellData: CellData\n  ) {\n    this._updateRawData(rawCellData);\n    this._rawData = rawCellData; // so TS does not complain\n  }\n\n  // TODO: figure out how to deal with empty rawData\n  // newData can be undefined/null if the cell is totally empty and unformatted\n  /**\n   * update cell using raw CellData coming back from sheets API\n   * @internal\n   */\n  _updateRawData(newData: CellData) {\n    this._rawData = newData;\n    this._draftData = {};\n    if (this._rawData?.effectiveValue && 'errorValue' in this._rawData.effectiveValue) {\n      this._error = new GoogleSpreadsheetCellErrorValue(this._rawData.effectiveValue.errorValue);\n    } else {\n      this._error = undefined;\n    }\n  }\n\n  // CELL LOCATION/ADDRESS /////////////////////////////////////////////////////////////////////////\n  get rowIndex() { return this._rowIndex; }\n  get columnIndex() { return this._columnIndex; }\n  get a1Column() { return columnToLetter(this._columnIndex + 1); }\n  get a1Row() { return this._rowIndex + 1; } // a1 row numbers start at 1 instead of 0\n  get a1Address() { return `${this.a1Column}${this.a1Row}`; }\n\n  // CELL CONTENTS - VALUE/FORMULA/NOTES ///////////////////////////////////////////////////////////\n  get value(): number | boolean | string | null | GoogleSpreadsheetCellErrorValue {\n    // const typeKey = _.keys(this._rawData.effectiveValue)[0];\n    if (this._draftData.value !== undefined) throw new Error('Value has been changed');\n    if (this._error) return this._error;\n    if (!this._rawData?.effectiveValue) return null;\n    return _.values(this._rawData.effectiveValue)[0];\n  }\n\n\n  set value(newValue: number | boolean | Date | string | null | undefined | GoogleSpreadsheetCellErrorValue) {\n    // had to include the GoogleSpreadsheetCellErrorValue in the type to make TS happy\n    if (newValue instanceof GoogleSpreadsheetCellErrorValue) {\n      throw new Error(\"You can't manually set a value to an error\");\n    }\n\n    if (_.isBoolean(newValue)) {\n      this._draftData.valueType = 'boolValue';\n    } else if (_.isString(newValue)) {\n      if (newValue.substring(0, 1) === '=') this._draftData.valueType = 'formulaValue';\n      else this._draftData.valueType = 'stringValue';\n    } else if (_.isFinite(newValue)) {\n      this._draftData.valueType = 'numberValue';\n    } else if (_.isNil(newValue)) {\n      // null or undefined\n      this._draftData.valueType = 'stringValue';\n      newValue = '';\n    } else {\n      throw new Error('Set value to boolean, string, or number');\n    }\n    this._draftData.value = newValue;\n  }\n\n  get valueType(): CellValueType | null {\n    // an error only happens with a formula (as far as I know)\n    if (this._error) return 'errorValue';\n    if (!this._rawData?.effectiveValue) return null;\n    return _.keys(this._rawData.effectiveValue)[0] as CellValueType;\n  }\n\n  /** The formatted value of the cell - this is the value as it's shown to the user */\n  get formattedValue(): string | null { return this._rawData?.formattedValue || null; }\n\n  get formula() { return _.get(this._rawData, 'userEnteredValue.formulaValue', null); }\n  set formula(newValue: string | null) {\n    if (!newValue) throw new Error('To clear a formula, set `cell.value = null`');\n    if (newValue.substring(0, 1) !== '=') throw new Error('formula must begin with \"=\"');\n    this.value = newValue; // use existing value setter\n  }\n  /**\n   * @deprecated use `cell.errorValue` instead\n   */\n  get formulaError() { return this._error; }\n  /**\n   * error contained in the cell, which can happen with a bad formula (maybe some other weird cases?)\n   */\n  get errorValue() { return this._error; }\n\n  get numberValue(): number | undefined {\n    if (this.valueType !== 'numberValue') return undefined;\n    return this.value as number;\n  }\n  set numberValue(val: number | undefined) {\n    this.value = val;\n  }\n\n  get boolValue(): boolean | undefined {\n    if (this.valueType !== 'boolValue') return undefined;\n    return this.value as boolean;\n  }\n  set boolValue(val: boolean | undefined) {\n    this.value = val;\n  }\n\n  get stringValue(): string | undefined {\n    if (this.valueType !== 'stringValue') return undefined;\n    return this.value as string;\n  }\n  set stringValue(val: string | undefined) {\n    if (val?.startsWith('=')) {\n      throw new Error('Use cell.formula to set formula values');\n    }\n    this.value = val;\n  }\n\n  /**\n   * Hyperlink contained within the cell.\n   *\n   * To modify, do not set directly. Instead set cell.formula, for example `cell.formula = \\'=HYPERLINK(\"http://google.com\", \"Google\")\\'`\n   */\n  get hyperlink() {\n    if (this._draftData.value) throw new Error('Save cell to be able to read hyperlink');\n    return this._rawData?.hyperlink;\n  }\n\n  /** a note attached to the cell */\n  get note(): string {\n    return this._draftData.note !== undefined ? this._draftData.note : this._rawData?.note || '';\n  }\n  set note(newVal: string | null | undefined | false) {\n    if (newVal === null || newVal === undefined || newVal === false) newVal = '';\n    if (!_.isString(newVal)) throw new Error('Note must be a string');\n    if (newVal === this._rawData?.note) delete this._draftData.note;\n    else this._draftData.note = newVal;\n  }\n\n  // CELL FORMATTING ///////////////////////////////////////////////////////////////////////////////\n  get userEnteredFormat() { return Object.freeze(this._rawData?.userEnteredFormat); }\n  get effectiveFormat() { return Object.freeze(this._rawData?.effectiveFormat); }\n\n  private _getFormatParam<T extends keyof CellFormat>(param: T): Readonly<CellFormat[T]> {\n    // we freeze the object so users don't change nested props accidentally\n    // TODO: figure out something that would throw an error if you try to update it?\n    if (_.get(this._draftData, `userEnteredFormat.${param}`)) {\n      throw new Error('User format is unsaved - save the cell to be able to read it again');\n    }\n    // TODO: figure out how to deal with possible empty rawData\n    // if (!this._rawData?.userEnteredFormat?.[param]) {\n    //   return undefined;\n    // }\n    return Object.freeze(this._rawData!.userEnteredFormat[param]);\n  }\n\n  private _setFormatParam<T extends keyof CellFormat>(param: T, newVal: CellFormat[T]) {\n    if (_.isEqual(newVal, _.get(this._rawData, `userEnteredFormat.${param}`))) {\n      _.unset(this._draftData, `userEnteredFormat.${param}`);\n    } else {\n      _.set(this._draftData, `userEnteredFormat.${param}`, newVal);\n      this._draftData.clearFormat = false;\n    }\n  }\n\n  // format getters\n  get numberFormat() { return this._getFormatParam('numberFormat'); }\n  get backgroundColor() { return this._getFormatParam('backgroundColor'); }\n  get backgroundColorStyle() { return this._getFormatParam('backgroundColorStyle'); }\n  get borders() { return this._getFormatParam('borders'); }\n  get padding() { return this._getFormatParam('padding'); }\n  get horizontalAlignment() { return this._getFormatParam('horizontalAlignment'); }\n  get verticalAlignment() { return this._getFormatParam('verticalAlignment'); }\n  get wrapStrategy() { return this._getFormatParam('wrapStrategy'); }\n  get textDirection() { return this._getFormatParam('textDirection'); }\n  get textFormat() { return this._getFormatParam('textFormat'); }\n  get hyperlinkDisplayType() { return this._getFormatParam('hyperlinkDisplayType'); }\n  get textRotation() { return this._getFormatParam('textRotation'); }\n\n  // format setters\n  set numberFormat(newVal: CellFormat['numberFormat']) { this._setFormatParam('numberFormat', newVal); }\n  set backgroundColor(newVal: CellFormat['backgroundColor']) { this._setFormatParam('backgroundColor', newVal); }\n  set backgroundColorStyle(newVal: CellFormat['backgroundColorStyle']) { this._setFormatParam('backgroundColorStyle', newVal); }\n  set borders(newVal: CellFormat['borders']) { this._setFormatParam('borders', newVal); }\n  set padding(newVal: CellFormat['padding']) { this._setFormatParam('padding', newVal); }\n  set horizontalAlignment(newVal: CellFormat['horizontalAlignment']) { this._setFormatParam('horizontalAlignment', newVal); }\n  set verticalAlignment(newVal: CellFormat['verticalAlignment']) { this._setFormatParam('verticalAlignment', newVal); }\n  set wrapStrategy(newVal: CellFormat['wrapStrategy']) { this._setFormatParam('wrapStrategy', newVal); }\n  set textDirection(newVal: CellFormat['textDirection']) { this._setFormatParam('textDirection', newVal); }\n  set textFormat(newVal: CellFormat['textFormat']) { this._setFormatParam('textFormat', newVal); }\n  set hyperlinkDisplayType(newVal: CellFormat['hyperlinkDisplayType']) { this._setFormatParam('hyperlinkDisplayType', newVal); }\n  set textRotation(newVal: CellFormat['textRotation']) { this._setFormatParam('textRotation', newVal); }\n\n  clearAllFormatting() {\n    // need to track this separately since by setting/unsetting things, we may end up with\n    // this._draftData.userEnteredFormat as an empty object, but not an intent to clear it\n    this._draftData.clearFormat = true;\n    delete this._draftData.userEnteredFormat;\n  }\n\n  // SAVING + UTILS ////////////////////////////////////////////////////////////////////////////////\n\n  // returns true if there are any updates that have not been saved yet\n  get _isDirty() {\n    // have to be careful about checking undefined rather than falsy\n    // in case a new value is empty string or 0 or false\n    if (this._draftData.note !== undefined) return true;\n    if (_.keys(this._draftData.userEnteredFormat).length) return true;\n    if (this._draftData.clearFormat) return true;\n    if (this._draftData.value !== undefined) return true;\n    return false;\n  }\n\n  discardUnsavedChanges() {\n    this._draftData = {};\n  }\n\n  /**\n   * saves updates for single cell\n   * usually it's better to make changes and call sheet.saveUpdatedCells\n   * */\n  async save() {\n    await this._sheet.saveCells([this]);\n  }\n\n  /**\n   * used by worksheet when saving cells\n   * returns an individual batchUpdate request to update the cell\n   * @internal\n   */\n  _getUpdateRequest() {\n    // this logic should match the _isDirty logic above\n    // but we need it broken up to build the request below\n    const isValueUpdated = this._draftData.value !== undefined;\n    const isNoteUpdated = this._draftData.note !== undefined;\n    const isFormatUpdated = !!_.keys(this._draftData.userEnteredFormat || {}).length;\n    const isFormatCleared = this._draftData.clearFormat;\n\n    // if no updates, we return null, which we can filter out later before sending requests\n    if (!_.some([isValueUpdated, isNoteUpdated, isFormatUpdated, isFormatCleared])) {\n      return null;\n    }\n\n    // build up the formatting object, which has some quirks...\n    const format = {\n      // have to pass the whole object or it will clear existing properties\n      ...this._rawData?.userEnteredFormat,\n      ...this._draftData.userEnteredFormat,\n    };\n    // if background color already set, cell has backgroundColor and backgroundColorStyle\n    // but backgroundColorStyle takes precendence so we must remove to set the color\n    // see https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/cells#CellFormat\n    if (_.get(this._draftData, 'userEnteredFormat.backgroundColor')) {\n      delete (format.backgroundColorStyle);\n    }\n\n    return {\n      updateCells: {\n        rows: [{\n          values: [{\n            ...isValueUpdated && {\n              userEnteredValue: { [this._draftData.valueType]: this._draftData.value },\n            },\n            ...isNoteUpdated && {\n              note: this._draftData.note,\n            },\n            ...isFormatUpdated && {\n              userEnteredFormat: format,\n            },\n            ...isFormatCleared && {\n              userEnteredFormat: {},\n            },\n          }],\n        }],\n        // turns into a string of which fields to update ex \"note,userEnteredFormat\"\n        fields: _.keys(_.pickBy({\n          userEnteredValue: isValueUpdated,\n          note: isNoteUpdated,\n          userEnteredFormat: isFormatUpdated || isFormatCleared,\n        })).join(','),\n        start: {\n          sheetId: this._sheet.sheetId,\n          rowIndex: this.rowIndex,\n          columnIndex: this.columnIndex,\n        },\n      },\n    };\n  }\n}\n","import { type ReadableStream } from 'stream/web';\nimport * as _ from './toolkit';\n\nimport { GoogleSpreadsheetRow } from './GoogleSpreadsheetRow';\nimport { GoogleSpreadsheetCell } from './GoogleSpreadsheetCell';\n\nimport {\n  getFieldMask, columnToLetter, letterToColumn, checkForDuplicateHeaders,\n} from './utils';\nimport { GoogleSpreadsheet } from './GoogleSpreadsheet';\nimport {\n  A1Range, SpreadsheetId, DimensionRangeIndexes, WorksheetDimension, WorksheetId, WorksheetProperties, A1Address,\n  RowIndex, ColumnIndex, DataFilterWithoutWorksheetId, DataFilter, GetValuesRequestOptions, WorksheetGridProperties,\n  WorksheetDimensionProperties, CellDataRange, AddRowOptions, GridRangeWithOptionalWorksheetId,\n  DataValidationRule,\n} from './types/sheets-types';\n\n\n// types of cell data accepted when using row based api\ntype RowCellData = string | number | boolean | Date;\n// raw row data can be passed in as an array or an object using header values as keys\ntype RawRowData = RowCellData[] | Record<string, RowCellData>;\n\nexport class GoogleSpreadsheetWorksheet {\n  // assume \"header row\" (for row-based calls) is in first row, can be adjusted later\n  private _headerRowIndex = 1;\n\n  private _rawProperties: WorksheetProperties | null = null;\n  private _cells: GoogleSpreadsheetCell[][] = [];\n  private _rowMetadata: any[] = [];\n  private _columnMetadata: any[] = [];\n\n  private _headerValues: string[] | undefined;\n  get headerValues() {\n    if (!this._headerValues) {\n      throw new Error('Header values are not yet loaded');\n    }\n    return this._headerValues!;\n  }\n\n  constructor(\n    /** parent GoogleSpreadsheet instance */\n    readonly _spreadsheet: GoogleSpreadsheet,\n    rawProperties: WorksheetProperties,\n    rawCellData?: CellDataRange[]\n  ) {\n    this._headerRowIndex = 1;\n\n    // basic properties\n    this._rawProperties = rawProperties;\n\n    this._cells = []; // we will use a 2d sparse array to store cells;\n\n    this._rowMetadata = []; // 1d sparse array\n    this._columnMetadata = [];\n\n    if (rawCellData) this._fillCellData(rawCellData);\n  }\n\n  // INTERNAL UTILITY FUNCTIONS ////////////////////////////////////////////////////////////////////\n\n  updateRawData(properties: WorksheetProperties, rawCellData: CellDataRange[]) {\n    this._rawProperties = properties;\n    this._fillCellData(rawCellData);\n  }\n\n  async _makeSingleUpdateRequest(requestType: string, requestParams: any) {\n    // pass the call up to the parent\n    return this._spreadsheet._makeSingleUpdateRequest(requestType, {\n      ...requestParams,\n    });\n  }\n\n  private _ensureInfoLoaded() {\n    if (!this._rawProperties) {\n      throw new Error('You must call `doc.loadInfo()` again before accessing this property');\n    }\n  }\n\n  /** clear local cache of sheet data/properties */\n  resetLocalCache(\n    /** set to true to clear data only, leaving sheet metadata/propeties intact */\n    dataOnly?: boolean\n  ) {\n    if (!dataOnly) this._rawProperties = null;\n    this._headerValues = undefined;\n    this._headerRowIndex = 1;\n    this._cells = [];\n  }\n\n  private _fillCellData(\n    dataRanges: CellDataRange[]\n  ) {\n    _.each(dataRanges, (range) => {\n      const startRow = range.startRow || 0;\n      const startColumn = range.startColumn || 0;\n      const numRows = range.rowMetadata.length;\n      const numColumns = range.columnMetadata.length;\n\n      // update cell data for entire range\n      for (let i = 0; i < numRows; i++) {\n        const actualRow = startRow + i;\n        for (let j = 0; j < numColumns; j++) {\n          const actualColumn = startColumn + j;\n\n          // if the row has not been initialized yet, do it\n          if (!this._cells[actualRow]) this._cells[actualRow] = [];\n\n          // see if the response includes some info for the cell\n          const cellData = _.get(range, `rowData[${i}].values[${j}]`);\n\n          // update the cell object or create it\n          if (this._cells[actualRow][actualColumn]) {\n            this._cells[actualRow][actualColumn]._updateRawData(cellData);\n          } else {\n            this._cells[actualRow][actualColumn] = new GoogleSpreadsheetCell(\n              this,\n              actualRow,\n              actualColumn,\n              cellData\n            );\n          }\n        }\n      }\n\n      // update row metadata\n      for (let i = 0; i < range.rowMetadata.length; i++) {\n        this._rowMetadata[startRow + i] = range.rowMetadata[i];\n      }\n      // update column metadata\n      for (let i = 0; i < range.columnMetadata.length; i++) {\n        this._columnMetadata[startColumn + i] = range.columnMetadata[i];\n      }\n    });\n  }\n\n  // TODO: make this handle A1 ranges as well?\n  private _addSheetIdToRange(range: GridRangeWithOptionalWorksheetId) {\n    if (range.sheetId && range.sheetId !== this.sheetId) {\n      throw new Error('Leave sheet ID blank or set to matching ID of this sheet');\n    }\n    return {\n      ...range,\n      sheetId: this.sheetId,\n    };\n  }\n\n\n  // PROPERTY GETTERS //////////////////////////////////////////////////////////////////////////////\n\n  private _getProp<T extends keyof WorksheetProperties>(param: T): WorksheetProperties[T] {\n    this._ensureInfoLoaded();\n    // see note about asserting info loaded on GoogleSpreasheet\n    return this._rawProperties![param];\n  }\n  // eslint-disable-line no-unused-vars\n  private _setProp<T extends keyof WorksheetProperties>(_param: T, _newVal: WorksheetProperties[T]) {\n    throw new Error('Do not update directly - use `updateProperties()`');\n  }\n\n  get sheetId() { return this._getProp('sheetId'); }\n  get title() { return this._getProp('title'); }\n  get index() { return this._getProp('index'); }\n  get sheetType() { return this._getProp('sheetType'); }\n  get gridProperties() { return this._getProp('gridProperties'); }\n  get hidden() { return this._getProp('hidden'); }\n  get tabColor() { return this._getProp('tabColor'); }\n  get rightToLeft() { return this._getProp('rightToLeft'); }\n  private get _headerRange() {\n    return `A${this._headerRowIndex}:${this.lastColumnLetter}${this._headerRowIndex}`;\n  }\n\n  set sheetId(newVal: WorksheetProperties['sheetId']) { this._setProp('sheetId', newVal); }\n  set title(newVal: WorksheetProperties['title']) { this._setProp('title', newVal); }\n  set index(newVal: WorksheetProperties['index']) { this._setProp('index', newVal); }\n  set sheetType(newVal: WorksheetProperties['sheetType']) { this._setProp('sheetType', newVal); }\n  set gridProperties(newVal: WorksheetProperties['gridProperties']) { this._setProp('gridProperties', newVal); }\n  set hidden(newVal: WorksheetProperties['hidden']) { this._setProp('hidden', newVal); }\n  set tabColor(newVal: WorksheetProperties['tabColor']) { this._setProp('tabColor', newVal); }\n  set rightToLeft(newVal: WorksheetProperties['rightToLeft']) { this._setProp('rightToLeft', newVal); }\n\n  get rowCount() {\n    this._ensureInfoLoaded();\n    return this.gridProperties.rowCount;\n  }\n  get columnCount() {\n    this._ensureInfoLoaded();\n    return this.gridProperties.columnCount;\n  }\n\n  get a1SheetName() { return `'${this.title.replace(/'/g, \"''\")}'`; }\n  get encodedA1SheetName() { return encodeURIComponent(this.a1SheetName); }\n  get lastColumnLetter() {\n    // TODO: double check behaviour if data not loaded\n    return this.columnCount ? columnToLetter(this.columnCount) : '';\n  }\n\n\n  // CELLS-BASED INTERACTIONS //////////////////////////////////////////////////////////////////////\n\n  get cellStats() {\n    let allCells = _.flatten(this._cells);\n    allCells = _.compact(allCells);\n    return {\n      nonEmpty: _.filter(allCells, (c) => c.value).length,\n      loaded: allCells.length,\n      total: this.rowCount * this.columnCount,\n    };\n  }\n\n  getCellByA1(a1Address: A1Address) {\n    const split = a1Address.match(/([A-Z]+)([0-9]+)/);\n    if (!split) throw new Error(`Cell address \"${a1Address}\" not valid`);\n    const columnIndex = letterToColumn(split[1]);\n    const rowIndex = parseInt(split[2]);\n    return this.getCell(rowIndex - 1, columnIndex - 1);\n  }\n\n  getCell(rowIndex: RowIndex, columnIndex: ColumnIndex) {\n    if (rowIndex < 0 || columnIndex < 0) throw new Error('Min coordinate is 0, 0');\n    if (rowIndex >= this.rowCount || columnIndex >= this.columnCount) {\n      throw new Error(`Out of bounds, sheet is ${this.rowCount} by ${this.columnCount}`);\n    }\n\n    if (!_.get(this._cells, `[${rowIndex}][${columnIndex}]`)) {\n      throw new Error('This cell has not been loaded yet');\n    }\n    return this._cells[rowIndex][columnIndex];\n  }\n\n  async loadCells(sheetFilters?: DataFilterWithoutWorksheetId | DataFilterWithoutWorksheetId[]) {\n    // load the whole sheet\n    if (!sheetFilters) return this._spreadsheet.loadCells(this.a1SheetName);\n\n    const filtersArray = _.isArray(sheetFilters) ? sheetFilters : [sheetFilters];\n    const filtersArrayWithSheetId: DataFilter[] = _.map(filtersArray, (filter) => {\n      // add sheet name to A1 ranges\n      if (_.isString(filter)) {\n        if (filter.startsWith(this.a1SheetName)) return filter;\n        return `${this.a1SheetName}!${filter}`;\n      }\n      if (_.isObject(filter)) {\n        // TODO: detect and support DeveloperMetadata filters\n\n        // check if the user passed in a sheet id\n        const filterAny = filter as any;\n        if (filterAny.sheetId && filterAny.sheetId !== this.sheetId) {\n          throw new Error('Leave sheet ID blank or set to matching ID of this sheet');\n        }\n\n        return { sheetId: this.sheetId, ...filter };\n      }\n      throw new Error('Each filter must be a A1 range string or gridrange object');\n    });\n    return this._spreadsheet.loadCells(filtersArrayWithSheetId);\n  }\n\n  async saveUpdatedCells() {\n    const cellsToSave = _.filter(_.flatten(this._cells), { _isDirty: true });\n    if (cellsToSave.length) {\n      await this.saveCells(cellsToSave);\n    }\n    // TODO: do we want to return stats? or the cells that got updated?\n  }\n\n  async saveCells(cellsToUpdate: GoogleSpreadsheetCell[]) {\n    // we send an individual \"updateCells\" request for each cell\n    // because the fields that are udpated for each group are the same\n    // and we dont want to accidentally overwrite something\n    const requests = _.map(cellsToUpdate, (cell) => cell._getUpdateRequest());\n    const responseRanges = _.map(cellsToUpdate, (c) => `${this.a1SheetName}!${c.a1Address}`);\n\n    // if nothing is being updated the request returned is just `null`\n    // so we make sure at least 1 request is valid - otherwise google throws a 400\n    if (!_.compact(requests).length) {\n      throw new Error('At least one cell must have something to update');\n    }\n\n    await this._spreadsheet._makeBatchUpdateRequest(requests, responseRanges);\n  }\n\n  // SAVING THIS FOR FUTURE USE\n  // puts the cells that need updating into batches\n  // async updateCellsByBatches() {\n  //   // saving this code, but it's problematic because each group must have the same update fields\n  //   const cellsByRow = _.groupBy(cellsToUpdate, 'rowIndex');\n  //   const groupsToSave = [];\n  //   _.each(cellsByRow, (cells, rowIndex) => {\n  //     let cellGroup = [];\n  //     _.each(cells, (c) => {\n  //       if (!cellGroup.length) {\n  //         cellGroup.push(c);\n  //       } else if (\n  //         cellGroup[cellGroup.length - 1].columnIndex ===\n  //         c.columnIndex - 1\n  //       ) {\n  //         cellGroup.push(c);\n  //       } else {\n  //         groupsToSave.push(cellGroup);\n  //         cellGroup = [];\n  //       }\n  //     });\n  //     groupsToSave.push(cellGroup);\n  //   });\n  //   const requests = _.map(groupsToSave, (cellGroup) => ({\n  //     updateCells: {\n  //       rows: [\n  //         {\n  //           values: _.map(cellGroup, (cell) => ({\n  //             ...cell._draftData.value && {\n  //               userEnteredValue: { [cell._draftData.valueType]: cell._draftData.value },\n  //             },\n  //             ...cell._draftData.note !== undefined && {\n  //               note: cell._draftData.note ,\n  //             },\n  //             ...cell._draftData.userEnteredFormat && {\n  //               userEnteredValue: cell._draftData.userEnteredFormat,\n  //             },\n  //           })),\n  //         },\n  //       ],\n  //       fields: 'userEnteredValue,note,userEnteredFormat',\n  //       start: {\n  //         sheetId: this.sheetId,\n  //         rowIndex: cellGroup[0].rowIndex,\n  //         columnIndex: cellGroup[0].columnIndex,\n  //       },\n  //     },\n  //   }));\n  //   const responseRanges = _.map(groupsToSave, (cellGroup) => {\n  //     let a1Range = cellGroup[0].a1Address;\n  //     if (cellGroup.length > 1)\n  //       a1Range += `:${cellGroup[cellGroup.length - 1].a1Address}`;\n  //     return `${cellGroup[0]._sheet.a1SheetName}!${a1Range}`;\n  //   });\n  // }\n\n  // ROW BASED FUNCTIONS ///////////////////////////////////////////////////////////////////////////\n\n  async _ensureHeaderRowLoaded() {\n    if (!this._headerValues) {\n      await this.loadHeaderRow();\n    }\n  }\n\n  async loadHeaderRow(headerRowIndex?: number) {\n    if (headerRowIndex !== undefined) this._headerRowIndex = headerRowIndex;\n    const rows = await this.getCellsInRange(this._headerRange);\n    this._processHeaderRow(rows);\n  }\n\n  private _processHeaderRow(rows: any[]) {\n    if (!rows) {\n      throw new Error('No values in the header row - fill the first row with header values before trying to interact with rows');\n    }\n    this._headerValues = _.map(rows[0], (header) => header?.trim());\n    if (!_.compact(this.headerValues).length) {\n      throw new Error('All your header cells are blank - fill the first row with header values before trying to interact with rows');\n    }\n    checkForDuplicateHeaders(this.headerValues);\n  }\n\n  async setHeaderRow(headerValues: string[], headerRowIndex?: number) {\n    if (!headerValues) return;\n    if (headerValues.length > this.columnCount) {\n      throw new Error(`Sheet is not large enough to fit ${headerValues.length} columns. Resize the sheet first.`);\n    }\n    const trimmedHeaderValues = _.map(headerValues, (h) => h?.trim());\n    checkForDuplicateHeaders(trimmedHeaderValues);\n\n    if (!_.compact(trimmedHeaderValues).length) {\n      throw new Error('All your header cells are blank -');\n    }\n\n    if (headerRowIndex) this._headerRowIndex = headerRowIndex;\n\n    const response = await this._spreadsheet.sheetsApi.put(\n      `values/${this.encodedA1SheetName}!${this._headerRowIndex}:${this._headerRowIndex}`,\n      {\n        searchParams: {\n          valueInputOption: 'USER_ENTERED', // other option is RAW\n          includeValuesInResponse: true,\n        },\n        json: {\n          range: `${this.a1SheetName}!${this._headerRowIndex}:${this._headerRowIndex}`,\n          majorDimension: 'ROWS',\n          values: [[\n            ...trimmedHeaderValues,\n            // pad the rest of the row with empty values to clear them all out\n            ..._.times(this.columnCount - trimmedHeaderValues.length, () => ''),\n          ]],\n        },\n      }\n    );\n    const data = await response.json<any>();\n    this._headerValues = data.updatedData.values[0];\n  }\n\n  // TODO: look at these types\n  async addRows(\n    rows: RawRowData[],\n    options: AddRowOptions = {}\n  ) {\n    // adds multiple rows in one API interaction using the append endpoint\n\n    // each row can be an array or object\n    // an array is just cells\n    // ex: ['column 1', 'column 2', 'column 3']\n    // an object must use the header row values as keys\n    // ex: { col1: 'column 1', col2: 'column 2', col3: 'column 3' }\n\n    // google bug that does not handle colons in sheet names\n    // see https://issuetracker.google.com/issues/150373119\n    if (this.title.includes(':')) {\n      throw new Error('Please remove the \":\" from your sheet title. There is a bug with the google API which breaks appending rows if any colons are in the sheet title.');\n    }\n\n    if (!_.isArray(rows)) throw new Error('You must pass in an array of row values to append');\n\n    await this._ensureHeaderRowLoaded();\n\n    // convert each row into an array of cell values rather than the key/value object\n    const rowsAsArrays: RawRowData[] = [];\n    _.each(rows, (row) => {\n      let rowAsArray;\n      if (_.isArray(row)) {\n        rowAsArray = row;\n      } else if (_.isObject(row)) {\n        rowAsArray = [];\n        for (let i = 0; i < this.headerValues.length; i++) {\n          const propName = this.headerValues[i];\n          rowAsArray[i] = row[propName];\n        }\n      } else {\n        throw new Error('Each row must be an object or an array');\n      }\n      rowsAsArrays.push(rowAsArray);\n    });\n\n    const response = await this._spreadsheet.sheetsApi.post(\n      `values/${this.encodedA1SheetName}!A${this._headerRowIndex}:append`,\n      {\n        searchParams: {\n          valueInputOption: options.raw ? 'RAW' : 'USER_ENTERED',\n          insertDataOption: options.insert ? 'INSERT_ROWS' : 'OVERWRITE',\n          includeValuesInResponse: true,\n        },\n        json: {\n          values: rowsAsArrays,\n        },\n      }\n    );\n\n    // extract the new row number from the A1-notation data range in the response\n    // ex: in \"'Sheet8!A2:C2\" -- we want the `2`\n    const data = await response.json<any>();\n    const { updatedRange } = data.updates;\n    let rowNumber = updatedRange.match(/![A-Z]+([0-9]+):?/)[1];\n    rowNumber = parseInt(rowNumber);\n\n\n    this._ensureInfoLoaded();\n    // if new rows were added, we need update sheet.rowRount\n    if (options.insert) {\n      this._rawProperties!.gridProperties.rowCount += rows.length;\n    } else if (rowNumber + rows.length > this.rowCount) {\n      // have to subtract 1 since one row was inserted at rowNumber\n      this._rawProperties!.gridProperties.rowCount = rowNumber + rows.length - 1;\n    }\n\n    return _.map(data.updates.updatedData.values, (rowValues) => {\n      const row = new GoogleSpreadsheetRow(this, rowNumber++, rowValues);\n      return row;\n    });\n  }\n\n  /** add a single row - see addRows for more info */\n  async addRow(rowValues: RawRowData, options?: AddRowOptions) {\n    const rows = await this.addRows([rowValues], options);\n    return rows[0];\n  }\n\n\n  private _rowCache: GoogleSpreadsheetRow[] = [];\n  async getRows<T extends Record<string, any>>(\n    options?: {\n      /** skip first N rows */\n      offset?: number,\n      /** limit number of rows fetched */\n      limit?: number,\n    }\n  ) {\n    // https://developers.google.com/sheets/api/guides/migration\n    // v4 API does not have equivalents for the row-order query parameters provided\n    // Reverse-order is trivial; simply process the returned values array in reverse order.\n    // Order by column is not supported for reads, but it is possible to sort the data then read\n\n    // v4 API does not currently have a direct equivalent for the Sheets API v3 structured queries\n    // However, you can retrieve the relevant data and sort through it as needed in your application\n    const offset = options?.offset || 0;\n    const limit = options?.limit || this.rowCount - 1;\n\n    const firstRow = 1 + this._headerRowIndex + offset;\n    const lastRow = firstRow + limit - 1; // inclusive so we subtract 1\n\n    let rawRows;\n    if (this._headerValues) {\n      const lastColumn = columnToLetter(this.headerValues.length);\n      rawRows = await this.getCellsInRange(\n        `A${firstRow}:${lastColumn}${lastRow}`\n      );\n    } else {\n      const result = await this.batchGetCellsInRange([this._headerRange,\n        `A${firstRow}:${this.lastColumnLetter}${lastRow}`]);\n      this._processHeaderRow(result[0]);\n      rawRows = result[1];\n    }\n\n    if (!rawRows) return [];\n\n    const rows = [];\n    let rowNum = firstRow;\n    for (let i = 0; i < rawRows.length; i++) {\n      const row = new GoogleSpreadsheetRow<T>(this, rowNum++, rawRows[i]);\n      this._rowCache[row.rowNumber] = row;\n      rows.push(row);\n    }\n    return rows;\n  }\n\n  /**\n   * @internal\n   * Used internally to update row numbers after deleting rows.\n   * Should not be called directly.\n   * */\n  _shiftRowCache(deletedRowNumber: number) {\n    delete this._rowCache[deletedRowNumber];\n    this._rowCache.forEach((row) => {\n      if (row.rowNumber > deletedRowNumber) {\n        row._updateRowNumber(row.rowNumber - 1);\n      }\n    });\n  }\n\n  async clearRows(\n    options?: {\n      start?: number,\n      end?: number,\n    }\n  ) {\n    // default to first row after header\n    const startRowIndex = options?.start || this._headerRowIndex + 1;\n    const endRowIndex = options?.end || this.rowCount;\n    await this._spreadsheet.sheetsApi.post(`values/${this.encodedA1SheetName}!${startRowIndex}:${endRowIndex}:clear`);\n    this._rowCache.forEach((row) => {\n      if (row.rowNumber >= startRowIndex && row.rowNumber <= endRowIndex) row._clearRowData();\n    });\n  }\n\n  // BASIC PROPS ///////////////////////////////////////////////////////////////////////////////////\n  /** @see https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#UpdateSheetPropertiesRequest */\n  async updateProperties(properties: Partial<Omit<WorksheetProperties, 'sheetId'>>) {\n    // Request type = `updateSheetProperties`\n\n    return this._makeSingleUpdateRequest('updateSheetProperties', {\n      properties: {\n        sheetId: this.sheetId,\n        ...properties,\n      },\n      fields: getFieldMask(properties),\n    });\n  }\n\n  /**\n   * passes through the call to updateProperties to update only the gridProperties object\n   */\n  async updateGridProperties(gridProperties: WorksheetGridProperties) {\n    return this.updateProperties({ gridProperties });\n  }\n\n  /** resize, internally just calls updateGridProperties */\n  async resize(gridProperties: Pick<WorksheetGridProperties, 'rowCount' | 'columnCount'>) {\n    return this.updateGridProperties(gridProperties);\n  }\n\n  /**\n   *\n   * @see https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#updatedimensionpropertiesrequest\n   */\n  async updateDimensionProperties(\n    columnsOrRows: WorksheetDimension,\n    properties: WorksheetDimensionProperties,\n    bounds: Partial<DimensionRangeIndexes>\n  ) {\n    // Request type = `updateDimensionProperties`\n\n    Object.keys(properties);\n\n    return this._makeSingleUpdateRequest('updateDimensionProperties', {\n      range: {\n        sheetId: this.sheetId,\n        dimension: columnsOrRows,\n        ...bounds,\n      },\n      properties,\n      fields: getFieldMask(properties as any),\n    });\n  }\n\n  // OTHER /////////////////////////////////////////////////////////////////////////////////////////\n\n  // this uses the \"values\" getter and does not give all the info about the cell contents\n  // it is used internally when loading header cells\n  async getCellsInRange(a1Range: A1Range, options?: GetValuesRequestOptions) {\n    const response = await this._spreadsheet.sheetsApi.get(`values/${this.encodedA1SheetName}!${a1Range}`, {\n      searchParams: options,\n    });\n    const data = await response.json<any>();\n    return data.values;\n  }\n\n  async batchGetCellsInRange(a1Ranges: A1Range[], options?: GetValuesRequestOptions) {\n    const ranges = a1Ranges.map((r) => `ranges=${this.encodedA1SheetName}!${r}`).join('&');\n    const response = await this._spreadsheet.sheetsApi.get(`values:batchGet?${ranges}`, {\n      searchParams: options,\n    });\n    const data = await response.json<any>();\n    return data.valueRanges.map((r: any) => r.values);\n  }\n\n  async updateNamedRange() {\n    // Request type = `updateNamedRange`\n    // https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#UpdateNamedRangeRequest\n  }\n\n  async addNamedRange() {\n    // Request type = `addNamedRange`\n    // https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#AddNamedRangeRequest\n  }\n\n  async deleteNamedRange() {\n    // Request type = `deleteNamedRange`\n    // https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#DeleteNamedRangeRequest\n  }\n\n  async repeatCell() {\n    // Request type = `repeatCell`\n    // https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#RepeatCellRequest\n  }\n\n  async autoFill() {\n    // Request type = `autoFill`\n    // https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#AutoFillRequest\n  }\n\n  async cutPaste() {\n    // Request type = `cutPaste`\n    // https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#CutPasteRequest\n  }\n\n  async copyPaste() {\n    // Request type = `copyPaste`\n    // https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#CopyPasteRequest\n  }\n\n  // TODO: check types on these ranges\n\n  /**\n   * Merges all cells in the range\n   * @see https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#MergeCellsRequest\n   */\n  async mergeCells(range: GridRangeWithOptionalWorksheetId, mergeType = 'MERGE_ALL') {\n    await this._makeSingleUpdateRequest('mergeCells', {\n      mergeType,\n      range: this._addSheetIdToRange(range),\n    });\n  }\n\n  /**\n   * Unmerges cells in the given range\n   * @see https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#UnmergeCellsRequest\n   */\n  async unmergeCells(range: GridRangeWithOptionalWorksheetId) {\n    await this._makeSingleUpdateRequest('unmergeCells', {\n      range: this._addSheetIdToRange(range),\n    });\n  }\n\n  async updateBorders() {\n    // Request type = `updateBorders`\n    // https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#UpdateBordersRequest\n  }\n\n  async addFilterView() {\n    // Request type = `addFilterView`\n    // https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#AddFilterViewRequest\n  }\n\n  async appendCells() {\n    // Request type = `appendCells`\n    // https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#AppendCellsRequest\n  }\n\n  async clearBasicFilter() {\n    // Request type = `clearBasicFilter`\n    // https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#ClearBasicFilterRequest\n  }\n\n  async deleteDimension() {\n    // Request type = `deleteDimension`\n    // https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#DeleteDimensionRequest\n  }\n\n  async deleteEmbeddedObject() {\n    // Request type = `deleteEmbeddedObject`\n    // https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#DeleteEmbeddedObjectRequest\n  }\n\n  async deleteFilterView() {\n    // Request type = `deleteFilterView`\n    // https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#DeleteFilterViewRequest\n  }\n\n  async duplicateFilterView() {\n    // Request type = `duplicateFilterView`\n    // https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#DuplicateFilterViewRequest\n  }\n\n  /**\n   * Duplicate worksheet within the document\n   * @see https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#DuplicateSheetRequest\n   */\n  async duplicate(\n    options?: {\n      id?: WorksheetId,\n      title?: string,\n      index?: number,\n    }\n  ) {\n    const response = await this._makeSingleUpdateRequest('duplicateSheet', {\n      sourceSheetId: this.sheetId,\n      ...options?.index !== undefined && { insertSheetIndex: options.index },\n      ...options?.id && { newSheetId: options.id },\n      ...options?.title && { newSheetName: options.title },\n    });\n    const newSheetId = response.properties.sheetId;\n    return this._spreadsheet.sheetsById[newSheetId];\n  }\n\n  async findReplace() {\n    // Request type = `findReplace`\n    // https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#FindReplaceRequest\n  }\n\n  /**\n   * Inserts rows or columns at a particular index\n   * @see https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#InsertDimensionRequest\n   */\n  async insertDimension(\n    columnsOrRows: WorksheetDimension,\n    rangeIndexes: DimensionRangeIndexes,\n    inheritFromBefore?: boolean\n  ) {\n    if (!columnsOrRows) throw new Error('You need to specify a dimension. i.e. COLUMNS|ROWS');\n    if (!_.isObject(rangeIndexes)) throw new Error('`range` must be an object containing `startIndex` and `endIndex`');\n    if (!_.isInteger(rangeIndexes.startIndex) || rangeIndexes.startIndex < 0) throw new Error('range.startIndex must be an integer >=0');\n    if (!_.isInteger(rangeIndexes.endIndex) || rangeIndexes.endIndex < 0) throw new Error('range.endIndex must be an integer >=0');\n    if (rangeIndexes.endIndex <= rangeIndexes.startIndex) throw new Error('range.endIndex must be greater than range.startIndex');\n\n    // default inheritFromBefore to true - unless inserting in the first row/column\n    if (inheritFromBefore === undefined) {\n      inheritFromBefore = rangeIndexes.startIndex > 0;\n    }\n\n    // do not allow inheritFromBefore if inserting at first row/column\n    if (inheritFromBefore && rangeIndexes.startIndex === 0) {\n      throw new Error('Cannot set inheritFromBefore to true if inserting in first row/column');\n    }\n\n    return this._makeSingleUpdateRequest('insertDimension', {\n      range: {\n        sheetId: this.sheetId,\n        dimension: columnsOrRows,\n        startIndex: rangeIndexes.startIndex,\n        endIndex: rangeIndexes.endIndex,\n      },\n      inheritFromBefore,\n    });\n  }\n\n  async insertRange() {\n    // Request type = `insertRange`\n    // https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#InsertRangeRequest\n  }\n\n  async moveDimension() {\n    // Request type = `moveDimension`\n    // https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#MoveDimensionRequest\n  }\n\n  async updateEmbeddedObjectPosition() {\n    // Request type = `updateEmbeddedObjectPosition`\n    // https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#UpdateEmbeddedObjectPositionRequest\n  }\n\n  async pasteData() {\n    // Request type = `pasteData`\n    // https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#PasteDataRequest\n  }\n\n  async textToColumns() {\n    // Request type = `textToColumns`\n    // https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#TextToColumnsRequest\n  }\n\n  async updateFilterView() {\n    // Request type = `updateFilterView`\n    // https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#UpdateFilterViewRequest\n  }\n\n  async deleteRange() {\n    // Request type = `deleteRange`\n    // https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#DeleteRangeRequest\n  }\n\n  async appendDimension() {\n    // Request type = `appendDimension`\n    // https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#AppendDimensionRequest\n  }\n\n  async addConditionalFormatRule() {\n    // Request type = `addConditionalFormatRule`\n    // https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#AddConditionalFormatRuleRequest\n  }\n\n  async updateConditionalFormatRule() {\n    // Request type = `updateConditionalFormatRule`\n    // https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#UpdateConditionalFormatRuleRequest\n  }\n\n  async deleteConditionalFormatRule() {\n    // Request type = `deleteConditionalFormatRule`\n    // https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#DeleteConditionalFormatRuleRequest\n  }\n\n  async sortRange() {\n    // Request type = `sortRange`\n    // https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#SortRangeRequest\n  }\n\n  /**\n   * Sets (or unsets) a data validation rule to every cell in the range\n   * @see https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#SetDataValidationRequest\n   */\n  async setDataValidation(\n    range: GridRangeWithOptionalWorksheetId,\n    /** data validation rule object, or set to false to clear an existing rule */\n    rule: DataValidationRule | false\n  ) {\n    return this._makeSingleUpdateRequest('setDataValidation', {\n      range: {\n        sheetId: this.sheetId,\n        ...range,\n      },\n      ...rule && { rule },\n    });\n  }\n\n  async setBasicFilter() {\n    // Request type = `setBasicFilter`\n    // https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#SetBasicFilterRequest\n  }\n\n  async addProtectedRange() {\n    // Request type = `addProtectedRange`\n    // https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#AddProtectedRangeRequest\n  }\n\n  async updateProtectedRange() {\n    // Request type = `updateProtectedRange`\n    // https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#UpdateProtectedRangeRequest\n  }\n\n  async deleteProtectedRange() {\n    // Request type = `deleteProtectedRange`\n    // https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#DeleteProtectedRangeRequest\n  }\n\n  async autoResizeDimensions() {\n    // Request type = `autoResizeDimensions`\n    // https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#AutoResizeDimensionsRequest\n  }\n\n  async addChart() {\n    // Request type = `addChart`\n    // https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#AddChartRequest\n  }\n\n  async updateChartSpec() {\n    // Request type = `updateChartSpec`\n    // https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#UpdateChartSpecRequest\n  }\n\n  async updateBanding() {\n    // Request type = `updateBanding`\n    // https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#UpdateBandingRequest\n  }\n\n  async addBanding() {\n    // Request type = `addBanding`\n    // https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#AddBandingRequest\n  }\n\n  async deleteBanding() {\n    // Request type = `deleteBanding`\n    // https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#DeleteBandingRequest\n  }\n\n  async createDeveloperMetadata() {\n    // Request type = `createDeveloperMetadata`\n    // https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#CreateDeveloperMetadataRequest\n  }\n\n  async updateDeveloperMetadata() {\n    // Request type = `updateDeveloperMetadata`\n    // https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#UpdateDeveloperMetadataRequest\n  }\n\n  async deleteDeveloperMetadata() {\n    // Request type = `deleteDeveloperMetadata`\n    // https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#DeleteDeveloperMetadataRequest\n  }\n\n  async randomizeRange() {\n    // Request type = `randomizeRange`\n    // https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#RandomizeRangeRequest\n  }\n\n  async addDimensionGroup() {\n    // Request type = `addDimensionGroup`\n    // https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#AddDimensionGroupRequest\n  }\n\n  async deleteDimensionGroup() {\n    // Request type = `deleteDimensionGroup`\n    // https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#DeleteDimensionGroupRequest\n  }\n\n  async updateDimensionGroup() {\n    // Request type = `updateDimensionGroup`\n    // https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#UpdateDimensionGroupRequest\n  }\n\n  async trimWhitespace() {\n    // Request type = `trimWhitespace`\n    // https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#TrimWhitespaceRequest\n  }\n\n  async deleteDuplicates() {\n    // Request type = `deleteDuplicates`\n    // https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#DeleteDuplicatesRequest\n  }\n\n  async addSlicer() {\n    // Request type = `addSlicer`\n    // https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#AddSlicerRequest\n  }\n\n  async updateSlicerSpec() {\n    // Request type = `updateSlicerSpec`\n    // https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#UpdateSlicerSpecRequest\n  }\n\n  /** delete this worksheet */\n  async delete() {\n    return this._spreadsheet.deleteSheet(this.sheetId);\n  }\n\n  /**\n   * copies this worksheet into another document/spreadsheet\n   * @see https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets.sheets/copyTo\n   * */\n  async copyToSpreadsheet(destinationSpreadsheetId: SpreadsheetId) {\n    const req = this._spreadsheet.sheetsApi.post(`sheets/${this.sheetId}:copyTo`, {\n      json: {\n        destinationSpreadsheetId,\n      },\n    });\n    const data = await req.json<any>();\n    return data;\n  }\n\n  /** clear data in the sheet - either the entire sheet or a specific range */\n  async clear(\n    /** optional A1 range to clear - defaults to entire sheet  */\n    a1Range?: A1Range\n  ) {\n    const range = a1Range ? `!${a1Range}` : '';\n    // sheet name without ie 'sheet1' rather than 'sheet1'!A1:B5 is all cells\n    await this._spreadsheet.sheetsApi.post(`values/${this.encodedA1SheetName}${range}:clear`);\n    this.resetLocalCache(true);\n  }\n\n  /** exports worksheet as CSV file (comma-separated values) */\n  async downloadAsCSV(): Promise<ArrayBuffer>;\n  async downloadAsCSV(returnStreamInsteadOfBuffer: false): Promise<ArrayBuffer>;\n  async downloadAsCSV(returnStreamInsteadOfBuffer: true): Promise<ReadableStream>;\n  async downloadAsCSV(returnStreamInsteadOfBuffer = false) {\n    return this._spreadsheet._downloadAs('csv', this.sheetId, returnStreamInsteadOfBuffer);\n  }\n  /** exports worksheet as TSC file (tab-separated values) */\n  async downloadAsTSV(): Promise<ArrayBuffer>;\n  async downloadAsTSV(returnStreamInsteadOfBuffer: false): Promise<ArrayBuffer>;\n  async downloadAsTSV(returnStreamInsteadOfBuffer: true): Promise<ReadableStream>;\n  async downloadAsTSV(returnStreamInsteadOfBuffer = false) {\n    return this._spreadsheet._downloadAs('tsv', this.sheetId, returnStreamInsteadOfBuffer);\n  }\n  /** exports worksheet as PDF */\n  async downloadAsPDF(): Promise<ArrayBuffer>;\n  async downloadAsPDF(returnStreamInsteadOfBuffer: false): Promise<ArrayBuffer>;\n  async downloadAsPDF(returnStreamInsteadOfBuffer: true): Promise<ReadableStream>;\n  async downloadAsPDF(returnStreamInsteadOfBuffer = false) {\n    return this._spreadsheet._downloadAs('pdf', this.sheetId, returnStreamInsteadOfBuffer);\n  }\n}\n","import ky, { HTTPError, KyInstance } from 'ky'; // eslint-disable-line import/no-extraneous-dependencies\nimport * as _ from './toolkit';\nimport { GoogleSpreadsheetWorksheet } from './GoogleSpreadsheetWorksheet';\nimport { getFieldMask } from './utils';\nimport {\n  DataFilter, GridRange, NamedRangeId, SpreadsheetId, SpreadsheetProperties, WorksheetId, WorksheetProperties,\n} from './types/sheets-types';\nimport { PermissionRoles, PermissionsList, PublicPermissionRoles } from './types/drive-types';\nimport { RecursivePartial } from './types/util-types';\nimport { AUTH_MODES, GoogleApiAuth } from './types/auth-types';\n\n\nconst SHEETS_API_BASE_URL = 'https://sheets.googleapis.com/v4/spreadsheets';\nconst DRIVE_API_BASE_URL = 'https://www.googleapis.com/drive/v3/files';\n\nconst EXPORT_CONFIG: Record<string, { singleWorksheet?: boolean }> = {\n  html: {},\n  zip: {},\n  xlsx: {},\n  ods: {},\n  csv: { singleWorksheet: true },\n  tsv: { singleWorksheet: true },\n  pdf: { singleWorksheet: true },\n};\ntype ExportFileTypes = keyof typeof EXPORT_CONFIG;\n\n\n\n\nfunction getAuthMode(auth: GoogleApiAuth) {\n  if ('getRequestHeaders' in auth) return AUTH_MODES.GOOGLE_AUTH_CLIENT;\n  if ('token' in auth && auth.token) return AUTH_MODES.RAW_ACCESS_TOKEN;\n  // google-auth-library now has an empty `apiKey` property\n  if ('apiKey' in auth && auth.apiKey) return AUTH_MODES.API_KEY;\n  throw new Error('Invalid auth');\n}\n\nasync function getRequestAuthConfig(auth: GoogleApiAuth): Promise<{\n  headers?: Record<string, string>;\n  searchParams?: Record<string, string>\n}> {\n  // google-auth-libary methods all can call this method to get the right headers\n  // JWT | OAuth2Client | GoogleAuth | Impersonate | AuthClient\n  if ('getRequestHeaders' in auth) {\n    const headers = await auth.getRequestHeaders();\n\n    // google-auth-library v10 uses a Headers object rather than a plain object\n    if ('entries' in headers) {\n      return { headers: Object.fromEntries(headers.entries()) };\n    } if (_.isObject(headers)) {\n      return { headers: headers as Record<string, string> };\n    }\n    throw new Error('unexpected headers returned from getRequestHeaders');\n  }\n\n  // API key only access passes through the api key as a query param\n  // (note this can only provide read-only access)\n  if ('apiKey' in auth && auth.apiKey) {\n    return { searchParams: { key: auth.apiKey } };\n  }\n\n  // RAW ACCESS TOKEN\n  if ('token' in auth && auth.token) {\n    return { headers: { Authorization: `Bearer ${auth.token}` } };\n  }\n\n  throw new Error('Invalid auth');\n}\n\n/**\n * Google Sheets document\n *\n * @description\n * **This class represents an entire google spreadsheet document**\n * Provides methods to interact with document metadata/settings, formatting, manage sheets, and acts as the main gateway to interacting with sheets and data that the document contains.q\n *\n */\nexport class GoogleSpreadsheet {\n  readonly spreadsheetId: string;\n\n  public auth: GoogleApiAuth;\n  get authMode() {\n    return getAuthMode(this.auth);\n  }\n\n  private _rawSheets: any;\n  private _rawProperties = null as SpreadsheetProperties | null;\n  private _spreadsheetUrl = null as string | null;\n  private _deleted = false;\n\n  /**\n   * Sheets API [ky](https://github.com/sindresorhus/ky?tab=readme-ov-file#kycreatedefaultoptions) instance\n   * authentication is automatically attached\n   * can be used if unsupported sheets calls need to be made\n   * @see https://developers.google.com/sheets/api/reference/rest\n   * */\n  readonly sheetsApi: KyInstance;\n\n  /**\n   * Drive API [ky](https://github.com/sindresorhus/ky?tab=readme-ov-file#kycreatedefaultoptions) instance\n   * authentication automatically attached\n   * can be used if unsupported drive calls need to be made\n   * @topic permissions\n   * @see https://developers.google.com/drive/api/v3/reference\n   * */\n  readonly driveApi: KyInstance;\n\n\n  /**\n   * initialize new GoogleSpreadsheet\n   * @category Initialization\n   * */\n  constructor(\n    /** id of google spreadsheet doc */\n    spreadsheetId: SpreadsheetId,\n    /** authentication to use with Google Sheets API */\n    auth: GoogleApiAuth\n  ) {\n    this.spreadsheetId = spreadsheetId;\n    this.auth = auth;\n\n    this._rawSheets = {};\n    this._spreadsheetUrl = null;\n\n    // create a ky instance with sheet root URL and hooks to handle auth\n    this.sheetsApi = ky.create({\n      prefixUrl: `${SHEETS_API_BASE_URL}/${spreadsheetId}`,\n      hooks: {\n        beforeRequest: [(r) => this._setAuthRequestHook(r)],\n        beforeError: [(e) => this._errorHook(e)],\n      },\n    });\n    this.driveApi = ky.create({\n      prefixUrl: `${DRIVE_API_BASE_URL}/${spreadsheetId}`,\n      hooks: {\n        beforeRequest: [(r) => this._setAuthRequestHook(r)],\n        beforeError: [(e) => this._errorHook(e)],\n      },\n    });\n  }\n\n\n  // INTERNAL UTILITY FUNCTIONS ////////////////////////////////////////////////////////////////////\n\n  /** @internal */\n  async _setAuthRequestHook(req: Request) {\n    const authConfig = await getRequestAuthConfig(this.auth);\n    if (authConfig.headers) {\n      Object.entries(authConfig.headers).forEach(([key, val]) => {\n        req.headers.set(key, String(val));\n      });\n    }\n\n    if (authConfig.searchParams) {\n      const url = new URL(req.url);\n      Object.entries(authConfig.searchParams).forEach(([key, val]) => {\n        url.searchParams.set(key, String(val));\n      });\n      // cannot change the URL with ky, so have to return a new request\n      return new Request(url, req);\n    }\n\n    return req;\n  }\n\n  /** @internal */\n  async _errorHook(error: HTTPError) {\n    const { response } = error;\n    const errorDataText = await response?.text();\n    let errorData;\n    try {\n      errorData = JSON.parse(errorDataText);\n    } catch (e) {\n      // console.log('parsing json failed', errorDataText);\n    }\n\n    if (errorData) {\n      // usually the error has a code and message, but occasionally not\n      if (!errorData.error) return error;\n\n      const { code, message } = errorData.error;\n      error.message = `Google API error - [${code}] ${message}`;\n      return error;\n    }\n\n    if (_.get(error, 'response.status') === 403) {\n      if ('apiKey' in this.auth) {\n        throw new Error('Sheet is private. Use authentication or make public. (see https://github.com/theoephraim/node-google-spreadsheet#a-note-on-authentication for details)');\n      }\n    }\n    return error;\n  }\n\n  /** @internal */\n  async _makeSingleUpdateRequest(requestType: string, requestParams: any) {\n    const response = await this.sheetsApi.post(':batchUpdate', {\n      json: {\n        requests: [{ [requestType]: requestParams }],\n        includeSpreadsheetInResponse: true,\n        // responseRanges: [string]\n        // responseIncludeGridData: true\n      },\n    });\n    const data = await response.json<any>();\n\n    this._updateRawProperties(data.updatedSpreadsheet.properties);\n    _.each(data.updatedSpreadsheet.sheets, (s: any) => this._updateOrCreateSheet(s));\n    // console.log('API RESPONSE', response.data.replies[0][requestType]);\n    return data.replies[0][requestType];\n  }\n\n  // TODO: review these types\n  // currently only used in batching cell updates\n  /** @internal */\n  async _makeBatchUpdateRequest(requests: any[], responseRanges?: string | string[]) {\n    // this is used for updating batches of cells\n    const response = await this.sheetsApi.post(':batchUpdate', {\n      json: {\n        requests,\n        includeSpreadsheetInResponse: true,\n        ...responseRanges && {\n          responseIncludeGridData: true,\n          ...responseRanges !== '*' && { responseRanges },\n        },\n      },\n    });\n\n    const data = await response.json<any>();\n    this._updateRawProperties(data.updatedSpreadsheet.properties);\n    _.each(data.updatedSpreadsheet.sheets, (s: any) => this._updateOrCreateSheet(s));\n  }\n\n  /** @internal */\n  _ensureInfoLoaded() {\n    if (!this._rawProperties) throw new Error('You must call `doc.loadInfo()` before accessing this property');\n  }\n\n  /** @internal */\n  _updateRawProperties(newProperties: SpreadsheetProperties) { this._rawProperties = newProperties; }\n\n  /** @internal */\n  _updateOrCreateSheet(sheetInfo: { properties: WorksheetProperties, data: any }) {\n    const { properties, data } = sheetInfo;\n    const { sheetId } = properties;\n    if (!this._rawSheets[sheetId]) {\n      this._rawSheets[sheetId] = new GoogleSpreadsheetWorksheet(this, properties, data);\n    } else {\n      this._rawSheets[sheetId].updateRawData(properties, data);\n    }\n  }\n\n  // BASIC PROPS //////////////////////////////////////////////////////////////////////////////\n  _getProp(param: keyof SpreadsheetProperties) {\n    this._ensureInfoLoaded();\n    // ideally ensureInfoLoaded would assert that _rawProperties is in fact loaded\n    // but this is not currently possible in TS - see https://github.com/microsoft/TypeScript/issues/49709\n    return this._rawProperties![param];\n  }\n\n  get title(): SpreadsheetProperties['title'] { return this._getProp('title'); }\n  get locale(): SpreadsheetProperties['locale'] { return this._getProp('locale'); }\n  get timeZone(): SpreadsheetProperties['timeZone'] { return this._getProp('timeZone'); }\n  get autoRecalc(): SpreadsheetProperties['autoRecalc'] { return this._getProp('autoRecalc'); }\n  get defaultFormat(): SpreadsheetProperties['defaultFormat'] { return this._getProp('defaultFormat'); }\n  get spreadsheetTheme(): SpreadsheetProperties['spreadsheetTheme'] { return this._getProp('spreadsheetTheme'); }\n  get iterativeCalculationSettings(): SpreadsheetProperties['iterativeCalculationSettings'] { return this._getProp('iterativeCalculationSettings'); }\n\n  /**\n   * update spreadsheet properties\n   * @see https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets#SpreadsheetProperties\n   * */\n  async updateProperties(properties: Partial<SpreadsheetProperties>) {\n    await this._makeSingleUpdateRequest('updateSpreadsheetProperties', {\n      properties,\n      fields: getFieldMask(properties),\n    });\n  }\n\n  // BASIC INFO ////////////////////////////////////////////////////////////////////////////////////\n  async loadInfo(includeCells = false) {\n    const response = await this.sheetsApi.get('', {\n      searchParams: {\n        ...includeCells && { includeGridData: true },\n      },\n    });\n    const data = await response.json<any>();\n    this._spreadsheetUrl = data.spreadsheetUrl;\n    this._rawProperties = data.properties;\n    data.sheets?.forEach((s: any) => this._updateOrCreateSheet(s));\n  }\n\n  resetLocalCache() {\n    this._rawProperties = null;\n    this._rawSheets = {};\n  }\n\n  // WORKSHEETS ////////////////////////////////////////////////////////////////////////////////////\n  get sheetCount() {\n    this._ensureInfoLoaded();\n    return _.values(this._rawSheets).length;\n  }\n\n  get sheetsById(): Record<WorksheetId, GoogleSpreadsheetWorksheet> {\n    this._ensureInfoLoaded();\n    return this._rawSheets;\n  }\n\n  get sheetsByIndex(): GoogleSpreadsheetWorksheet[] {\n    this._ensureInfoLoaded();\n    return _.sortBy(this._rawSheets, 'index');\n  }\n\n  get sheetsByTitle(): Record<string, GoogleSpreadsheetWorksheet> {\n    this._ensureInfoLoaded();\n    return _.keyBy(this._rawSheets, 'title');\n  }\n\n  /**\n   * Add new worksheet to document\n   * @see https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#AddSheetRequest\n   * */\n  async addSheet(\n    properties: Partial<\n    RecursivePartial<WorksheetProperties>\n    & {\n      headerValues: string[],\n      headerRowIndex: number\n    }\n    > = {}\n  ) {\n    const response = await this._makeSingleUpdateRequest('addSheet', {\n      properties: _.omit(properties, 'headerValues', 'headerRowIndex'),\n    });\n    // _makeSingleUpdateRequest already adds the sheet\n    const newSheetId = response.properties.sheetId;\n    const newSheet = this.sheetsById[newSheetId];\n\n    if (properties.headerValues) {\n      await newSheet.setHeaderRow(properties.headerValues, properties.headerRowIndex);\n    }\n\n    return newSheet;\n  }\n\n  /**\n   * delete a worksheet\n   * @see https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#DeleteSheetRequest\n   * */\n  async deleteSheet(sheetId: WorksheetId) {\n    await this._makeSingleUpdateRequest('deleteSheet', { sheetId });\n    delete this._rawSheets[sheetId];\n  }\n\n  // NAMED RANGES //////////////////////////////////////////////////////////////////////////////////\n\n  /**\n   * create a new named range\n   * @see https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#AddNamedRangeRequest\n   */\n  async addNamedRange(\n    /** name of new named range */\n    name: string,\n    /** GridRange object describing range */\n    range: GridRange,\n    /** id for named range (optional) */\n    namedRangeId?: string\n  ) {\n    // TODO: add named range to local cache\n    return this._makeSingleUpdateRequest('addNamedRange', {\n      name,\n      namedRangeId,\n      range,\n    });\n  }\n\n  /**\n   * delete a named range\n   * @see https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#DeleteNamedRangeRequest\n   * */\n  async deleteNamedRange(\n    /** id of named range to delete */\n    namedRangeId: NamedRangeId\n  ) {\n    // TODO: remove named range from local cache\n    return this._makeSingleUpdateRequest('deleteNamedRange', { namedRangeId });\n  }\n\n  // LOADING CELLS /////////////////////////////////////////////////////////////////////////////////\n\n  /** fetch cell data into local cache */\n  async loadCells(\n    /**\n     * single filter or array of filters\n     * strings are treated as A1 ranges, objects are treated as GridRange objects\n     * pass nothing to fetch all cells\n     * */\n    filters?: DataFilter | DataFilter[]\n  ) {\n    // TODO: make it support DeveloperMetadataLookup objects\n\n\n\n    // TODO: switch to this mode if using a read-only auth token?\n    const readOnlyMode = this.authMode === AUTH_MODES.API_KEY;\n\n    const filtersArray = _.isArray(filters) ? filters : [filters];\n    const dataFilters = _.map(filtersArray, (filter) => {\n      if (_.isString(filter)) {\n        return readOnlyMode ? filter : { a1Range: filter };\n      }\n      if (_.isObject(filter)) {\n        if (readOnlyMode) {\n          throw new Error('Only A1 ranges are supported when fetching cells with read-only access (using only an API key)');\n        }\n        // TODO: make this support Developer Metadata filters\n        return { gridRange: filter };\n      }\n      throw new Error('Each filter must be an A1 range string or a gridrange object');\n    });\n\n    let result;\n    // when using an API key only, we must use the regular get endpoint\n    // because :getByDataFilter requires higher access\n    if (this.authMode === AUTH_MODES.API_KEY) {\n      const params = new URLSearchParams();\n      params.append('includeGridData', 'true');\n      dataFilters.forEach((singleFilter) => {\n        if (!_.isString(singleFilter)) {\n          throw new Error('Only A1 ranges are supported when fetching cells with read-only access (using only an API key)');\n        }\n        params.append('ranges', singleFilter);\n      });\n      result = await this.sheetsApi.get('', {\n        searchParams: params,\n      });\n    // otherwise we use the getByDataFilter endpoint because it is more flexible\n    } else {\n      result = await this.sheetsApi.post(':getByDataFilter', {\n        json: {\n          includeGridData: true,\n          dataFilters,\n        },\n      });\n    }\n\n    const data = await result?.json<any>();\n    _.each(data.sheets, (sheet: any) => { this._updateOrCreateSheet(sheet); });\n  }\n\n  // EXPORTING /////////////////////////////////////////////////////////////\n\n  /**\n   * export/download helper, not meant to be called directly (use downloadAsX methods on spreadsheet and worksheet instead)\n   * @internal\n   */\n  async _downloadAs(\n    fileType: ExportFileTypes,\n    worksheetId: WorksheetId | undefined,\n    returnStreamInsteadOfBuffer?: boolean\n  ) {\n    // see https://stackoverflow.com/questions/11619805/using-the-google-drive-api-to-download-a-spreadsheet-in-csv-format/51235960#51235960\n\n    if (!EXPORT_CONFIG[fileType]) throw new Error(`unsupported export fileType - ${fileType}`);\n    if (EXPORT_CONFIG[fileType].singleWorksheet) {\n      if (worksheetId === undefined) throw new Error(`Must specify worksheetId when exporting as ${fileType}`);\n    } else if (worksheetId) throw new Error(`Cannot specify worksheetId when exporting as ${fileType}`);\n\n    // google UI shows \"html\" but passes through \"zip\"\n    if (fileType === 'html') fileType = 'zip';\n\n    if (!this._spreadsheetUrl) throw new Error('Cannot export sheet that is not fully loaded');\n\n    const exportUrl = this._spreadsheetUrl.replace('edit', 'export');\n    const response = await this.sheetsApi.get(exportUrl, {\n      prefixUrl: '', // unset baseUrl since we're not hitting the normal sheets API\n      searchParams: {\n        id: this.spreadsheetId,\n        format: fileType,\n        // worksheetId can be 0\n        ...worksheetId !== undefined && { gid: worksheetId },\n      },\n    });\n    if (returnStreamInsteadOfBuffer) {\n      return response.body;\n    }\n    return response.arrayBuffer();\n  }\n\n  /**\n   * exports entire document as html file (zipped)\n   * @topic export\n   * */\n  async downloadAsZippedHTML(): Promise<ArrayBuffer>;\n  async downloadAsZippedHTML(returnStreamInsteadOfBuffer: false): Promise<ArrayBuffer>;\n  async downloadAsZippedHTML(returnStreamInsteadOfBuffer: true): Promise<ReadableStream>;\n  async downloadAsZippedHTML(returnStreamInsteadOfBuffer?: boolean) {\n    return this._downloadAs('html', undefined, returnStreamInsteadOfBuffer);\n  }\n\n  /**\n   * @deprecated\n   * use `doc.downloadAsZippedHTML()` instead\n   * */\n  async downloadAsHTML(returnStreamInsteadOfBuffer?: boolean) {\n    return this._downloadAs('html', undefined, returnStreamInsteadOfBuffer);\n  }\n\n  /**\n   * exports entire document as xlsx spreadsheet (Microsoft Office Excel)\n   * @topic export\n   * */\n  async downloadAsXLSX(): Promise<ArrayBuffer>;\n  async downloadAsXLSX(returnStreamInsteadOfBuffer: false): Promise<ArrayBuffer>;\n  async downloadAsXLSX(returnStreamInsteadOfBuffer: true): Promise<ReadableStream>;\n  async downloadAsXLSX(returnStreamInsteadOfBuffer = false) {\n    return this._downloadAs('xlsx', undefined, returnStreamInsteadOfBuffer);\n  }\n  /**\n   * exports entire document as ods spreadsheet (Open Office)\n   * @topic export\n  */\n  async downloadAsODS(): Promise<ArrayBuffer>;\n  async downloadAsODS(returnStreamInsteadOfBuffer: false): Promise<ArrayBuffer>;\n  async downloadAsODS(returnStreamInsteadOfBuffer: true): Promise<ReadableStream>;\n  async downloadAsODS(returnStreamInsteadOfBuffer = false) {\n    return this._downloadAs('ods', undefined, returnStreamInsteadOfBuffer);\n  }\n\n\n  async delete() {\n    await this.driveApi.delete('');\n    this._deleted = true;\n    // endpoint returns nothing when successful\n  }\n\n  // PERMISSIONS ///////////////////////////////////////////////////////////////////////////////////\n\n  /**\n   * list all permissions entries for doc\n   */\n  async listPermissions(): Promise<PermissionsList> {\n    const listReq = await this.driveApi.get('permissions', {\n      searchParams: {\n        fields: 'permissions(id,type,emailAddress,domain,role,displayName,photoLink,deleted)',\n      },\n    });\n    const data = await listReq.json<{ permissions: PermissionsList }>();\n    return data.permissions;\n  }\n\n  async setPublicAccessLevel(role: PublicPermissionRoles | false) {\n    const permissions = await this.listPermissions();\n    const existingPublicPermission = _.find(permissions, (p) => p.type === 'anyone');\n\n    if (role === false) {\n      if (!existingPublicPermission) {\n        // doc is already not public... could throw an error or just do nothing\n        return;\n      }\n      await this.driveApi.delete(`permissions/${existingPublicPermission.id}`);\n    } else {\n      const _shareReq = await this.driveApi.post('permissions', {\n        json: {\n          role: role || 'viewer',\n          type: 'anyone',\n        },\n      });\n    }\n  }\n\n  /** share document to email or domain */\n  async share(emailAddressOrDomain: string, opts?: {\n    /** set role level, defaults to owner */\n    role?: PermissionRoles,\n\n    /** set to true if email is for a group */\n    isGroup?: boolean,\n\n    /** set to string to include a custom message, set to false to skip sending a notification altogether */\n    emailMessage?: string | false,\n\n    // moveToNewOwnersRoot?: string,\n    // /** send a notification email (default = true) */\n    // sendNotificationEmail?: boolean,\n    // /** support My Drives and shared drives (default = false) */\n    // supportsAllDrives?: boolean,\n\n    // /** Issue the request as a domain administrator */\n    // useDomainAdminAccess?: boolean,\n  }) {\n    let emailAddress: string | undefined;\n    let domain: string | undefined;\n    if (emailAddressOrDomain.includes('@')) {\n      emailAddress = emailAddressOrDomain;\n    } else {\n      domain = emailAddressOrDomain;\n    }\n\n\n    const shareReq = await this.driveApi.post('permissions', {\n      searchParams: {\n        ...opts?.emailMessage === false && { sendNotificationEmail: false },\n        ..._.isString(opts?.emailMessage) && { emailMessage: opts?.emailMessage },\n        ...opts?.role === 'owner' && { transferOwnership: true },\n      },\n      json: {\n        role: opts?.role || 'writer',\n        ...emailAddress && {\n          type: opts?.isGroup ? 'group' : 'user',\n          emailAddress,\n        },\n        ...domain && {\n          type: 'domain',\n          domain,\n        },\n      },\n    });\n\n    return shareReq.json();\n  }\n\n  //\n  // CREATE NEW DOC ////////////////////////////////////////////////////////////////////////////////\n  static async createNewSpreadsheetDocument(auth: GoogleApiAuth, properties?: Partial<SpreadsheetProperties>) {\n    // see updateProperties for more info about available properties\n\n    if (getAuthMode(auth) === AUTH_MODES.API_KEY) {\n      throw new Error('Cannot use api key only to create a new spreadsheet - it is only usable for read-only access of public docs');\n    }\n\n    // TODO: handle injecting default credentials if running on google infra\n\n    const authConfig = await getRequestAuthConfig(auth);\n\n    const response = await ky.post(SHEETS_API_BASE_URL, {\n      ...authConfig, // has the auth header\n      json: {\n        properties,\n      },\n    });\n\n    const data = await response.json<any>();\n    const newSpreadsheet = new GoogleSpreadsheet(data.spreadsheetId, auth);\n\n    // TODO ideally these things aren't public, might want to refactor anyway\n    newSpreadsheet._spreadsheetUrl = data.spreadsheetUrl;\n    newSpreadsheet._rawProperties = data.properties;\n    _.each(data.sheets, (s: any) => newSpreadsheet._updateOrCreateSheet(s));\n\n    return newSpreadsheet;\n  }\n}\n"]}