@noloco/google-spreadsheet
Version:
Google Sheets API -- simple interface to read/write data and manage sheets
1,085 lines (1,073 loc) • 46.2 kB
TypeScript
import * as axios from 'axios';
import { AxiosInstance, InternalAxiosRequestConfig, AxiosResponse, AxiosError } from 'axios';
import { Stream } from 'stream';
import { ReadableStream } from 'node:stream/web';
import { Headers } from 'google-auth-library/build/src/auth/oauth2client';
type MakeOptional<Type, Key extends keyof Type> = Omit<Type, Key> & Partial<Pick<Type, Key>>;
type RecursivePartial<T> = {
[P in keyof T]?: RecursivePartial<T[P]>;
};
type Integer = number;
type SpreadsheetId = string;
type WorksheetId = number;
type DataSourceId = string;
type WorksheetIndex = number;
type RowOrColumnIndex = number;
type RowIndex = number;
type ColumnIndex = number;
type A1Address = string;
type A1Range = string;
type NamedRangeId = string;
type DeveloperMetadataId = number;
type DeveloperMetadataKey = string;
type DeveloperMetadataValue = string;
/**
* ISO language code
* @example en
* @example en_US
* */
type LocaleCode = string;
/**
* timezone code, if not recognized, may be a custom time zone such as `GMT-07:00`
* @example America/New_York
* */
type Timezone = string;
/** @see https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/sheets#SheetType */
type WorksheetType =
/** The sheet is a grid. */
'GRID' |
/** The sheet has no grid and instead has an object like a chart or image. */
'OBJECT' |
/** The sheet connects with an external DataSource and shows the preview of data. */
'DATA_SOURCE';
type WorksheetDimension = 'ROWS' | 'COLUMNS';
type HyperlinkDisplayType = 'LINKED' | 'PLAIN_TEXT';
/** @see https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/cells#numberformattype */
type NumberFormatType =
/** Text formatting, e.g 1000.12 */
'TEXT' |
/** Number formatting, e.g, 1,000.12 */
'NUMBER' |
/** Percent formatting, e.g 10.12% */
'PERCENT' |
/** Currency formatting, e.g $1,000.12 */
'CURRENCY' |
/** Date formatting, e.g 9/26/2008 */
'DATE' |
/** Time formatting, e.g 3:59:00 PM */
'TIME' |
/** Date+Time formatting, e.g 9/26/08 15:59:00 */
'DATE_TIME' |
/** Scientific number formatting, e.g 1.01E+03 */
'SCIENTIFIC';
/** @see https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/other#errortype */
type CellValueErrorType =
/** Corresponds to the #ERROR! error */
'ERROR' |
/** Corresponds to the #NULL! error. */
'NULL_VALUE' |
/** Corresponds to the #DIV/0 error. */
'DIVIDE_BY_ZERO' |
/** Corresponds to the #VALUE! error. */
'VALUE' |
/** Corresponds to the #REF! error. */
'REF' |
/** Corresponds to the #NAME? error. */
'NAME' |
/** Corresponds to the #NUM! error. */
'NUM' |
/** Corresponds to the #N/A error. */
'N_A' |
/** Corresponds to the Loading... state. */
'LOADING';
/** @see https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/other#horizontalalign */
type HorizontalAlign = 'LEFT' | 'CENTER' | 'RIGHT';
/** @see https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/cells#verticalalign */
type VerticalAlign = 'TOP' | 'MIDDLE' | 'BOTTOM';
/** @see https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/cells#textdirection */
type TextDirection = 'LEFT_TO_RIGHT' | 'RIGHT_TO_LEFT';
/** @see https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/cells#wrapstrategy */
type WrapStrategy = 'OVERFLOW_CELL' | 'LEGACY_WRAP' | 'CLIP' | 'WRAP';
/** @see https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/other#themecolortype */
type ThemeColorType = 'TEXT' | 'BACKGROUND' | 'ACCENT1' | 'ACCENT2' | 'ACCENT3' | 'ACCENT4' | 'ACCENT5' | 'ACCENT6' | 'LINK';
/** @see https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets#recalculationinterval */
type RecalculationInterval = 'ON_CHANGE' | 'MINUTE' | 'HOUR';
/** @see https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets.developerMetadata#developermetadatavisibility */
type DeveloperMetadataVisibility =
/** Document-visible metadata is accessible from any developer project with access to the document. */
'DOCUMENT'
/** Project-visible metadata is only visible to and accessible by the developer project that created the metadata. */
| 'PROJECT';
/** @see https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets.developerMetadata#developermetadatalocationtype */
type DeveloperMetadataLocationType = 'ROW' | 'COLUMN' | 'SHEET' | 'SPREADSHEET';
type DeveloperMetadataLookup = {
locationType: DeveloperMetadataLocationType;
metadataLocation: DeveloperMetadataLocation;
locationMatchingStrategy: 'EXACT_LOCATION' | 'INTERSECTING_LOCATION';
metadataId: DeveloperMetadataId;
metadataKey: DeveloperMetadataKey;
metadataValue: DeveloperMetadataValue;
visibility: DeveloperMetadataVisibility;
};
type TextFormat = {
foregroundColor?: Color;
foregroundColorStyle?: ColorStyle;
fontFamily?: string;
fontSize?: number;
bold?: boolean;
italic?: boolean;
strikethrough?: boolean;
underline?: boolean;
};
/** @see https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/cells#Style */
type CellBorderLineStyle = 'NONE' | 'DOTTED' | 'DASHED' | 'SOLID' | 'SOLID_MEDIUM' | 'SOLID_THICK' | 'DOUBLE';
/** @see https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/cells#Border */
type CellBorder = {
style: CellBorderLineStyle;
width: number;
color: Color;
colorStyle: ColorStyle;
};
/** @see https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/cells#Borders */
type CellBorders = {
top: CellBorder;
bottom: CellBorder;
left: CellBorder;
right: CellBorder;
};
/** @see https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/cells#Padding */
type CellPadding = {
top: number;
bottom: number;
left: number;
right: number;
};
type TextRotation = {
angle: number;
vertical: boolean;
};
type DimensionRangeIndexes = {
startIndex: RowOrColumnIndex;
endIndex: RowOrColumnIndex;
};
/** @see https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets.developerMetadata#DeveloperMetadata.DeveloperMetadataLocation */
interface DeveloperMetadataLocation {
sheetId: number;
spreadsheet: boolean;
dimensionRange: DimensionRange;
locationType: DeveloperMetadataLocationType;
}
/** @see https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets.developerMetadata#DeveloperMetadata.DeveloperMetadataLocation */
interface DeveloperMetadata {
metadataId: number;
metadataKey: string;
metadataValue: string;
location: DeveloperMetadataLocation;
visibility: DeveloperMetadataVisibility;
}
interface WorksheetDimensionProperties {
pixelSize: number;
hiddenByUser: boolean;
hiddenByFilter: boolean;
/**
* @see https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets.developerMetadata#DeveloperMetadata
*/
developerMetadata: DeveloperMetadata[];
}
/** @see https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/other#DataSourceColumnReference */
type DataSourceColumnReference = {
name: string;
};
/** @see https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/other#DataSourceColumn */
type DataSourceColumn = {
reference: DataSourceColumnReference;
formula: string;
};
/** @see https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/other#DataExecutionState */
type DataExecutionState =
/** The data execution has not started. */
'NOT_STARTED' |
/** The data execution has started and is running. */
'RUNNING' |
/** The data execution has completed successfully. */
'SUCCEEDED' |
/** The data execution has completed with errors. */
'FAILED';
/** @see https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/other#DataExecutionState */
type DataExecutionErrorCode =
/** Default value, do not use. */
'DATA_EXECUTION_ERROR_CODE_UNSPECIFIED' |
/** The data execution timed out. */
'TIMED_OUT' |
/** The data execution returns more rows than the limit. */
'TOO_MANY_ROWS' |
/** The data execution returns more columns than the limit. */
'TOO_MANY_COLUMNS' |
/** The data execution returns more cells than the limit. */
'TOO_MANY_CELLS' |
/** Error is received from the backend data execution engine (e.g. BigQuery). Check errorMessage for details. */
'ENGINE' |
/** One or some of the provided data source parameters are invalid. */
'PARAMETER_INVALID' |
/** The data execution returns an unsupported data type. */
'UNSUPPORTED_DATA_TYPE' |
/** The data execution returns duplicate column names or aliases. */
'DUPLICATE_COLUMN_NAMES' |
/** The data execution is interrupted. Please refresh later. */
'INTERRUPTED' |
/** The data execution is currently in progress, can not be refreshed until it completes. */
'CONCURRENT_QUERY' |
/** Other errors. */
'OTHER' |
/** The data execution returns values that exceed the maximum characters allowed in a single cell. */
'TOO_MANY_CHARS_PER_CELL' |
/** The database referenced by the data source is not found. */
'DATA_NOT_FOUND' |
/** The user does not have access to the database referenced by the data source. */
'PERMISSION_DENIED' |
/** The data execution returns columns with missing aliases. */
'MISSING_COLUMN_ALIAS' |
/** The data source object does not exist. */
'OBJECT_NOT_FOUND' |
/** The data source object is currently in error state. To force refresh, set force in RefreshDataSourceRequest . */
'OBJECT_IN_ERROR_STATE' |
/** The data source object specification is invalid. */
'OBJECT_SPEC_INVALID';
/** @see https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/other#DataExecutionStatus */
type DataExecutionStatus = {
'state': DataExecutionState;
'errorCode': DataExecutionErrorCode;
'errorMessage': string;
'lastRefreshTime': string;
};
/** @see https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/sheets#DataSourceSheetProperties */
type DataSourceSheetProperties = {
'dataSourceId': DataSourceId;
'columns': DataSourceColumn[];
'dataExecutionStatus': DataExecutionStatus;
};
/** @see https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets#SpreadsheetProperties */
type SpreadsheetProperties = {
/** title of the spreadsheet */
title: string;
/** locale of the spreadsheet (note - not all locales are supported) */
locale: LocaleCode;
/** amount of time to wait before volatile functions are recalculated */
autoRecalc: RecalculationInterval;
/** timezone of the sheet */
timeZone: Timezone;
defaultFormat: any;
iterativeCalculationSettings: any;
spreadsheetTheme: any;
};
/** @see https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/sheets#SheetProperties */
type WorksheetProperties = {
'sheetId': WorksheetId;
'title': string;
'index': WorksheetIndex;
'sheetType': WorksheetType;
'gridProperties': WorksheetGridProperties;
'hidden': boolean;
'tabColor': Color;
'tabColorStyle': ColorStyle;
'rightToLeft': boolean;
'dataSourceSheetProperties': DataSourceSheetProperties;
};
/** @see https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/cells#CellFormat */
type CellFormat = {
/** format describing how number values should be represented to the user */
numberFormat: NumberFormat;
/** @deprecated use backgroundColorStyle */
backgroundColor: Color;
backgroundColorStyle: ColorStyle;
borders: CellBorders;
padding: CellPadding;
horizontalAlignment: HorizontalAlign;
verticalAlignment: VerticalAlign;
wrapStrategy: WrapStrategy;
textDirection: TextDirection;
textFormat: TextFormat;
hyperlinkDisplayType: HyperlinkDisplayType;
textRotation: TextRotation;
};
/** @see https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/cells#numberformat */
type NumberFormat = {
type: NumberFormatType;
/**
* pattern string used for formatting
* @see https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/cells#numberformat
* */
pattern: string;
};
/** @see https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/sheets#GridProperties */
type WorksheetGridProperties = {
rowCount: number;
columnCount: number;
frozenRowCount?: number;
frozenColumnCount?: number;
hideGridlines?: boolean;
rowGroupControlAfter?: boolean;
columnGroupControlAfter?: boolean;
};
/**
*
* @see https://developers.google.com/sheets/api/reference/rest/v4/DimensionRange
*/
type DimensionRange = {
sheetId: WorksheetId;
dimension: WorksheetDimension;
startIndex?: Integer;
endIndex?: Integer;
};
/**
* object describing a range in a sheet
* see https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/other#GridRange
* */
type GridRange = {
/** The sheet this range is on */
sheetId: WorksheetId;
/** The start row (inclusive) of the range, or not set if unbounded. */
startRowIndex?: Integer;
/** The end row (exclusive) of the range, or not set if unbounded. */
endRowIndex?: Integer;
/** The start column (inclusive) of the range, or not set if unbounded. */
startColumnIndex?: Integer;
/** The end column (exclusive) of the range, or not set if unbounded. */
endColumnIndex?: Integer;
};
type GridRangeWithoutWorksheetId = Omit<GridRange, 'sheetId'>;
type GridRangeWithOptionalWorksheetId = MakeOptional<GridRange, 'sheetId'>;
type DataFilter = A1Range | GridRange;
type DataFilterWithoutWorksheetId = A1Range | GridRangeWithoutWorksheetId;
type DeveloperMetadataDataFilter = {
a1Range?: A1Range;
gridRange?: GridRange;
developerMetadataLookup?: DeveloperMetadataLookup;
};
/** @see https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/other#colorstyle */
type ColorStyle = {
rgbColor: Color;
} | {
themeColor: ThemeColorType;
};
/** @see https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/other#Color */
type Color = {
red: number;
green: number;
blue: number;
/** docs say alpha is not generally supported? */
alpha?: number;
};
/** @see https://developers.google.com/sheets/api/reference/rest/v4/ValueRenderOption */
type ValueRenderOption =
/** Values will be calculated & formatted in the reply according to the cell's formatting. Formatting is based on the spreadsheet's locale, not the requesting user's locale. For example, if A1 is 1.23 and A2 is =A1 and formatted as currency, then A2 would return "$1.23". */
'FORMATTED_VALUE' |
/** Values will be calculated, but not formatted in the reply. For example, if A1 is 1.23 and A2 is =A1 and formatted as currency, then A2 would return the number 1.23. */
'UNFORMATTED_VALUE' |
/** Values will not be calculated. The reply will include the formulas. For example, if A1 is 1.23 and A2 is =A1 and formatted as currency, then A2 would return "=A1". */
'FORMULA';
/** @see https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets.values/get#query-parameters */
type GetValuesRequestOptions = {
majorDimension?: WorksheetDimension;
valueRenderOption?: ValueRenderOption;
};
/**
* Info about an error in a cell
* @see https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/other#errortype
*/
type ErrorValue = {
type: CellValueErrorType;
message: string;
};
/** @see https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/other#ExtendedValue */
type ExtendedValue = {
numberValue: number;
} | {
stringValue: string;
} | {
boolValue: boolean;
} | {
formulaValue: string;
} | {
errorValue: ErrorValue;
};
type CellValueType = 'boolValue' | 'stringValue' | 'numberValue' | 'errorValue';
/** @see https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/cells */
type CellData = {
/** The value the user entered in the cell. e.g., 1234, 'Hello', or =NOW() Note: Dates, Times and DateTimes are represented as doubles in serial number format. */
userEnteredValue: ExtendedValue;
/** The effective value of the cell. For cells with formulas, this is the calculated value. For cells with literals, this is the same as the userEnteredValue. This field is read-only. */
effectiveValue: ExtendedValue;
/** The formatted value of the cell. This is the value as it's shown to the user. This field is read-only. */
formattedValue: string;
/** The format the user entered for the cell. */
userEnteredFormat: CellFormat;
/** The effective format being used by the cell. This includes the results of applying any conditional formatting and, if the cell contains a formula, the computed number format. If the effective format is the default format, effective format will not be written. This field is read-only. */
effectiveFormat: CellFormat;
/** The data validation rule applied to the cell. */
dataValidation: DataValidationRule;
/** hyperlink in the cell if any */
hyperlink?: string;
/** note on the cell */
note?: string;
};
/** shape of the cell data sent back when fetching the sheet */
type CellDataRange = {
startRow?: RowIndex;
startColumn?: ColumnIndex;
rowMetadata: any[];
columnMetadata: any[];
rowData: {
values: any[];
}[];
};
type AddRowOptions = {
/** set to true to use raw mode rather than user entered */
raw?: boolean;
/** set to true to insert new rows in the sheet while adding this data */
insert?: boolean;
};
/**
* @see https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/other#ConditionType
*/
type ConditionType = 'NUMBER_GREATER' | 'NUMBER_GREATER_THAN_EQ' | 'NUMBER_LESS' | 'NUMBER_LESS_THAN_EQ' | 'NUMBER_EQ' | 'NUMBER_NOT_EQ' | 'NUMBER_BETWEEN' | 'NUMBER_NOT_BETWEEN' | 'TEXT_CONTAINS' | 'TEXT_NOT_CONTAINS' | 'TEXT_STARTS_WITH' | 'TEXT_ENDS_WITH' | 'TEXT_EQ' | 'TEXT_IS_EMAIL' | 'TEXT_IS_URL' | 'DATE_EQ' | 'DATE_BEFORE' | 'DATE_AFTER' | 'DATE_ON_OR_BEFORE' | 'DATE_ON_OR_AFTER' | 'DATE_BETWEEN' | 'DATE_NOT_BETWEEN' | 'DATE_IS_VALID' | 'ONE_OF_RANGE' | 'ONE_OF_LIST' | 'BLANK' | 'NOT_BLANK' | 'CUSTOM_FORMULA' | 'BOOLEAN' | 'TEXT_NOT_EQ' | 'DATE_NOT_EQ' | 'FILTER_EXPRESSION';
/**
* @see https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/other#relativedate
*/
type RelativeDate = 'PAST_YEAR' | 'PAST_MONTH' | 'PAST_WEEK' | 'YESTERDAY' | 'TODAY' | 'TOMORROW';
/**
* @see https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/other#ConditionValue
*/
type ConditionValue = {
relativeDate: RelativeDate;
userEnteredValue?: undefined;
} | {
relativeDate?: undefined;
userEnteredValue: string;
};
/**
* @see https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/other#BooleanCondition
*/
type BooleanCondition = {
/** The type of condition. */
type: ConditionType;
/**
* The values of the condition.
* The number of supported values depends on the condition type. Some support zero values, others one or two values, and ConditionType.ONE_OF_LIST supports an arbitrary number of values.
*/
values: ConditionValue[];
};
/**
* @see https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/cells#DataValidationRule
*
* example:
* - https://stackoverflow.com/a/43442775/3068233
*/
type DataValidationRule = {
/** The condition that data in the cell must match. */
condition: BooleanCondition;
/** A message to show the user when adding data to the cell. */
inputMessage?: string;
/** True if invalid data should be rejected. */
strict: boolean;
/** True if the UI should be customized based on the kind of condition. If true, "List" conditions will show a dropdown. */
showCustomUi: boolean;
};
declare class GoogleSpreadsheetRow<T extends Record<string, any> = Record<string, any>> {
/** parent GoogleSpreadsheetWorksheet instance */
readonly _worksheet: GoogleSpreadsheetWorksheet;
/** the A1 row (1-indexed) */
private _rowNumber;
/** raw underlying data for row */
private _rawData;
constructor(
/** parent GoogleSpreadsheetWorksheet instance */
_worksheet: GoogleSpreadsheetWorksheet,
/** the A1 row (1-indexed) */
_rowNumber: number,
/** raw underlying data for row */
_rawData: any[]);
private _deleted;
get deleted(): boolean;
/** row number (matches A1 notation, ie first row is 1) */
get rowNumber(): number;
/**
* @internal
* Used internally to update row numbers after deleting rows.
* Should not be called directly.
*/
_updateRowNumber(newRowNumber: number): void;
get a1Range(): string;
/** get row's value of specific cell (by header key) */
get(key: keyof T): any;
/** set row's value of specific cell (by header key) */
set<K extends keyof T>(key: K, val: T[K]): void;
/** set multiple values in the row at once from an object */
assign(obj: T): void;
/** return raw object of row data */
toObject(): Partial<T>;
/** save row values */
save(options?: {
raw?: boolean;
}): Promise<void>;
/** delete this row */
delete(): Promise<any>;
createDeveloperMetadata(metadataKey: DeveloperMetadataKey, metadataValue: DeveloperMetadataValue, visibility: DeveloperMetadataVisibility, metadataId: DeveloperMetadataId): Promise<any>;
getDeveloperMetadata(): Promise<any>;
/**
* @internal
* Used internally to clear row data after calling sheet.clearRows
* Should not be called directly.
*/
_clearRowData(): void;
}
/**
* Cell error
*
* not a js "error" that gets thrown, but a value that holds an error code and message for a cell
* it's useful to use a class so we can check `instanceof`
* @see https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/other#ErrorType
*/
declare class GoogleSpreadsheetCellErrorValue {
/**
* type of the error
* @see https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/other#ErrorType
* */
readonly type: CellValueErrorType;
/** A message with more information about the error (in the spreadsheet's locale) */
readonly message: string;
constructor(rawError: ErrorValue);
}
declare class GoogleSpreadsheetCell {
readonly _sheet: GoogleSpreadsheetWorksheet;
private _rowIndex;
private _columnIndex;
private _rawData?;
private _draftData;
private _error?;
constructor(_sheet: GoogleSpreadsheetWorksheet, _rowIndex: RowIndex, _columnIndex: ColumnIndex, rawCellData: CellData);
/**
* update cell using raw CellData coming back from sheets API
* @internal
*/
_updateRawData(newData: CellData): void;
get rowIndex(): number;
get columnIndex(): number;
get a1Column(): string;
get a1Row(): number;
get a1Address(): string;
get value(): number | boolean | string | null | GoogleSpreadsheetCellErrorValue;
set value(newValue: number | boolean | Date | string | null | undefined | GoogleSpreadsheetCellErrorValue);
get valueType(): CellValueType | null;
/** The formatted value of the cell - this is the value as it's shown to the user */
get formattedValue(): string | null;
get formula(): string | null;
set formula(newValue: string | null);
/**
* @deprecated use `cell.errorValue` instead
*/
get formulaError(): GoogleSpreadsheetCellErrorValue | undefined;
/**
* error contained in the cell, which can happen with a bad formula (maybe some other weird cases?)
*/
get errorValue(): GoogleSpreadsheetCellErrorValue | undefined;
get numberValue(): number | undefined;
set numberValue(val: number | undefined);
get boolValue(): boolean | undefined;
set boolValue(val: boolean | undefined);
get stringValue(): string | undefined;
set stringValue(val: string | undefined);
/**
* Hyperlink contained within the cell.
*
* To modify, do not set directly. Instead set cell.formula, for example `cell.formula = \'=HYPERLINK("http://google.com", "Google")\'`
*/
get hyperlink(): string | undefined;
/** a note attached to the cell */
get note(): string;
set note(newVal: string | null | undefined | false);
get userEnteredFormat(): Readonly<CellFormat | undefined>;
get effectiveFormat(): Readonly<CellFormat | undefined>;
get dataValidation(): Readonly<DataValidationRule | undefined>;
private _getFormatParam;
private _setFormatParam;
get numberFormat(): CellFormat['numberFormat'];
get backgroundColor(): CellFormat['backgroundColor'];
get backgroundColorStyle(): CellFormat['backgroundColorStyle'];
get borders(): CellFormat['borders'];
get padding(): CellFormat['padding'];
get horizontalAlignment(): CellFormat['horizontalAlignment'];
get verticalAlignment(): CellFormat['verticalAlignment'];
get wrapStrategy(): CellFormat['wrapStrategy'];
get textDirection(): CellFormat['textDirection'];
get textFormat(): CellFormat['textFormat'];
get hyperlinkDisplayType(): CellFormat['hyperlinkDisplayType'];
get textRotation(): CellFormat['textRotation'];
set numberFormat(newVal: CellFormat['numberFormat']);
set backgroundColor(newVal: CellFormat['backgroundColor']);
set backgroundColorStyle(newVal: CellFormat['backgroundColorStyle']);
set borders(newVal: CellFormat['borders']);
set padding(newVal: CellFormat['padding']);
set horizontalAlignment(newVal: CellFormat['horizontalAlignment']);
set verticalAlignment(newVal: CellFormat['verticalAlignment']);
set wrapStrategy(newVal: CellFormat['wrapStrategy']);
set textDirection(newVal: CellFormat['textDirection']);
set textFormat(newVal: CellFormat['textFormat']);
set hyperlinkDisplayType(newVal: CellFormat['hyperlinkDisplayType']);
set textRotation(newVal: CellFormat['textRotation']);
clearAllFormatting(): void;
get _isDirty(): boolean;
discardUnsavedChanges(): void;
/**
* saves updates for single cell
* usually it's better to make changes and call sheet.saveUpdatedCells
* */
save(): Promise<void>;
/**
* Add developer metadata to the cell
*/
createDeveloperMetadata(metadataKey: DeveloperMetadataKey, metadataValue: DeveloperMetadataValue, visibility?: DeveloperMetadataVisibility, metadataId?: DeveloperMetadataId): Promise<any>;
/**
* Get developer metadata from the cell
*/
getDeveloperMetadata(): Promise<any>;
/**
* used by worksheet when saving cells
* returns an individual batchUpdate request to update the cell
* @internal
*/
_getUpdateRequest(): {
updateCells: {
rows: {
values: any[];
}[];
fields: string;
start: {
sheetId: number;
rowIndex: number;
columnIndex: number;
};
};
} | null;
}
type RowCellData = string | number | boolean | Date;
type RawRowData = RowCellData[] | Record<string, RowCellData>;
declare class GoogleSpreadsheetWorksheet {
/** parent GoogleSpreadsheet instance */
readonly _spreadsheet: GoogleSpreadsheet;
private _headerRowIndex;
private _rawProperties;
private _cells;
private _rowMetadata;
private _columnMetadata;
private _headerValues;
get headerValues(): string[];
constructor(
/** parent GoogleSpreadsheet instance */
_spreadsheet: GoogleSpreadsheet, rawProperties: WorksheetProperties, rawCellData?: CellDataRange[]);
updateRawData(properties: WorksheetProperties, rawCellData: CellDataRange[]): void;
_makeSingleUpdateRequest(requestType: string, requestParams: any): Promise<any>;
private _ensureInfoLoaded;
/** clear local cache of sheet data/properties */
resetLocalCache(
/** set to true to clear data only, leaving sheet metadata/propeties intact */
dataOnly?: boolean): void;
private _fillCellData;
private _addSheetIdToRange;
private _getProp;
private _setProp;
get sheetId(): WorksheetProperties['sheetId'];
get title(): WorksheetProperties['title'];
get index(): WorksheetProperties['index'];
get sheetType(): WorksheetProperties['sheetType'];
get gridProperties(): WorksheetProperties['gridProperties'];
get hidden(): WorksheetProperties['hidden'];
get tabColor(): WorksheetProperties['tabColor'];
get rightToLeft(): WorksheetProperties['rightToLeft'];
get rowMetadata(): any[];
get columnMetadata(): any[];
private get _headerRange();
set sheetId(newVal: WorksheetProperties['sheetId']);
set title(newVal: WorksheetProperties['title']);
set index(newVal: WorksheetProperties['index']);
set sheetType(newVal: WorksheetProperties['sheetType']);
set gridProperties(newVal: WorksheetProperties['gridProperties']);
set hidden(newVal: WorksheetProperties['hidden']);
set tabColor(newVal: WorksheetProperties['tabColor']);
set rightToLeft(newVal: WorksheetProperties['rightToLeft']);
get rowCount(): number;
get columnCount(): number;
get a1SheetName(): string;
get encodedA1SheetName(): string;
get lastColumnLetter(): string;
get cellStats(): {
nonEmpty: number;
loaded: number;
total: number;
};
getCellByA1(a1Address: A1Address): GoogleSpreadsheetCell;
getCell(rowIndex: RowIndex, columnIndex: ColumnIndex): GoogleSpreadsheetCell;
loadCells(sheetFilters?: DataFilterWithoutWorksheetId | DataFilterWithoutWorksheetId[]): Promise<void>;
saveUpdatedCells(): Promise<void>;
saveCells(cellsToUpdate: GoogleSpreadsheetCell[]): Promise<void>;
_ensureHeaderRowLoaded(): Promise<void>;
loadHeaderRow(headerRowIndex?: number, options?: GetValuesRequestOptions): Promise<void>;
private _processHeaderRow;
setHeaderRow(headerValues: string[], headerRowIndex?: number): Promise<void>;
addRows(rows: RawRowData[], options?: AddRowOptions): Promise<GoogleSpreadsheetRow<Record<string, any>>[]>;
/** add a single row - see addRows for more info */
addRow(rowValues: RawRowData, options?: AddRowOptions): Promise<GoogleSpreadsheetRow<Record<string, any>>>;
private _rowCache;
getRows<T extends Record<string, any>>(options?: {
/** skip first N rows */
offset?: number;
/** limit number of rows fetched */
limit?: number;
} & GetValuesRequestOptions): Promise<GoogleSpreadsheetRow<T>[]>;
/**
* @internal
* Used internally to update row numbers after deleting rows.
* Should not be called directly.
* */
_shiftRowCache(deletedRowNumber: number): void;
clearRows(options?: {
start?: number;
end?: number;
}): Promise<void>;
/** @see https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#UpdateSheetPropertiesRequest */
updateProperties(properties: Partial<Omit<WorksheetProperties, 'sheetId'>>): Promise<any>;
/**
* passes through the call to updateProperties to update only the gridProperties object
*/
updateGridProperties(gridProperties: WorksheetGridProperties): Promise<any>;
/** resize, internally just calls updateGridProperties */
resize(gridProperties: Pick<WorksheetGridProperties, 'rowCount' | 'columnCount'>): Promise<any>;
/**
*
* @see https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#updatedimensionpropertiesrequest
*/
updateDimensionProperties(columnsOrRows: WorksheetDimension, properties: WorksheetDimensionProperties, bounds: Partial<DimensionRangeIndexes>): Promise<any>;
getCellsInRange(a1Range: A1Range, options?: GetValuesRequestOptions): Promise<any>;
batchGetCellsInRange(a1Ranges: A1Range[], options?: GetValuesRequestOptions): Promise<any>;
updateNamedRange(): Promise<void>;
addNamedRange(): Promise<void>;
deleteNamedRange(): Promise<void>;
repeatCell(): Promise<void>;
autoFill(): Promise<void>;
cutPaste(): Promise<void>;
copyPaste(): Promise<void>;
/**
* Merges all cells in the range
* @see https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#MergeCellsRequest
*/
mergeCells(range: GridRangeWithOptionalWorksheetId, mergeType?: string): Promise<void>;
/**
* Unmerges cells in the given range
* @see https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#UnmergeCellsRequest
*/
unmergeCells(range: GridRangeWithOptionalWorksheetId): Promise<void>;
updateBorders(): Promise<void>;
addFilterView(): Promise<void>;
appendCells(): Promise<void>;
clearBasicFilter(): Promise<void>;
deleteDimension(): Promise<void>;
deleteEmbeddedObject(): Promise<void>;
deleteFilterView(): Promise<void>;
duplicateFilterView(): Promise<void>;
/**
* Duplicate worksheet within the document
* @see https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#DuplicateSheetRequest
*/
duplicate(options?: {
id?: WorksheetId;
title?: string;
index?: number;
}): Promise<GoogleSpreadsheetWorksheet>;
findReplace(): Promise<void>;
/**
* Inserts rows or columns at a particular index
* @see https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#InsertDimensionRequest
*/
insertDimension(columnsOrRows: WorksheetDimension, rangeIndexes: DimensionRangeIndexes, inheritFromBefore?: boolean): Promise<any>;
insertRange(): Promise<void>;
moveDimension(): Promise<void>;
updateEmbeddedObjectPosition(): Promise<void>;
pasteData(): Promise<void>;
textToColumns(): Promise<void>;
updateFilterView(): Promise<void>;
deleteRange(): Promise<void>;
appendDimension(): Promise<void>;
addConditionalFormatRule(): Promise<void>;
updateConditionalFormatRule(): Promise<void>;
deleteConditionalFormatRule(): Promise<void>;
sortRange(): Promise<void>;
/**
* Sets (or unsets) a data validation rule to every cell in the range
* @see https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#SetDataValidationRequest
*/
setDataValidation(range: GridRangeWithOptionalWorksheetId,
/** data validation rule object, or set to false to clear an existing rule */
rule: DataValidationRule | false): Promise<any>;
setBasicFilter(): Promise<void>;
addProtectedRange(): Promise<void>;
updateProtectedRange(): Promise<void>;
deleteProtectedRange(): Promise<void>;
autoResizeDimensions(): Promise<void>;
addChart(): Promise<void>;
updateChartSpec(): Promise<void>;
updateBanding(): Promise<void>;
addBanding(): Promise<void>;
deleteBanding(): Promise<void>;
createDeveloperMetadata(metadataKey: DeveloperMetadataKey, metadataValue: DeveloperMetadataValue, visibility: DeveloperMetadataVisibility, metadataId: DeveloperMetadataId): Promise<any>;
updateDeveloperMetadata(): Promise<void>;
deleteDeveloperMetadata(): Promise<void>;
randomizeRange(): Promise<void>;
addDimensionGroup(): Promise<void>;
deleteDimensionGroup(): Promise<void>;
updateDimensionGroup(): Promise<void>;
trimWhitespace(): Promise<void>;
deleteDuplicates(): Promise<void>;
addSlicer(): Promise<void>;
updateSlicerSpec(): Promise<void>;
/** delete this worksheet */
delete(): Promise<void>;
/**
* copies this worksheet into another document/spreadsheet
* @see https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets.sheets/copyTo
* */
copyToSpreadsheet(destinationSpreadsheetId: SpreadsheetId): Promise<axios.AxiosResponse<any, any>>;
/** clear data in the sheet - either the entire sheet or a specific range */
clear(
/** optional A1 range to clear - defaults to entire sheet */
a1Range?: A1Range): Promise<void>;
/** exports worksheet as CSV file (comma-separated values) */
downloadAsCSV(): Promise<ArrayBuffer>;
downloadAsCSV(returnStreamInsteadOfBuffer: false): Promise<ArrayBuffer>;
downloadAsCSV(returnStreamInsteadOfBuffer: true): Promise<ReadableStream>;
/** exports worksheet as TSC file (tab-separated values) */
downloadAsTSV(): Promise<ArrayBuffer>;
downloadAsTSV(returnStreamInsteadOfBuffer: false): Promise<ArrayBuffer>;
downloadAsTSV(returnStreamInsteadOfBuffer: true): Promise<ReadableStream>;
/** exports worksheet as PDF */
downloadAsPDF(): Promise<ArrayBuffer>;
downloadAsPDF(returnStreamInsteadOfBuffer: false): Promise<ArrayBuffer>;
downloadAsPDF(returnStreamInsteadOfBuffer: true): Promise<ReadableStream>;
}
type PermissionRoles = 'owner' | 'writer' | 'commenter' | 'reader';
type PublicPermissionRoles = Exclude<PermissionRoles, 'owner'>;
type PublicPermissionListEntry = {
id: 'anyoneWithLink';
type: 'anyone';
role: PublicPermissionRoles;
};
type UserOrGroupPermissionListEntry = {
id: string;
displayName: string;
type: 'user' | 'group';
photoLink?: string;
emailAddress: string;
role: PermissionRoles;
deleted: boolean;
};
type DomainPermissionListEntry = {
id: string;
displayName: string;
type: 'domain';
domain: string;
role: PublicPermissionRoles;
photoLink?: string;
};
type PermissionsList = (PublicPermissionListEntry | UserOrGroupPermissionListEntry | DomainPermissionListEntry)[];
/** single type to handle all valid auth types */
type GoogleApiAuth = {
getRequestHeaders: () => Promise<Headers>;
} | {
apiKey: string;
} | {
token: string;
};
declare enum AUTH_MODES {
GOOGLE_AUTH_CLIENT = "google_auth",
RAW_ACCESS_TOKEN = "raw_access_token",
API_KEY = "api_key"
}
declare const EXPORT_CONFIG: Record<string, {
singleWorksheet?: boolean;
}>;
type ExportFileTypes = keyof typeof EXPORT_CONFIG;
/**
* Google Sheets document
*
* @description
* **This class represents an entire google spreadsheet document**
* 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
*
*/
declare class GoogleSpreadsheet {
readonly spreadsheetId: string;
auth: GoogleApiAuth;
get authMode(): AUTH_MODES;
private _rawSheets;
private _rawProperties;
private _spreadsheetUrl;
private _deleted;
private _rateLimitedRetries;
private _initialRateLimitedRetryDelay;
/**
* Sheets API [axios](https://axios-http.com) instance
* authentication is automatically attached
* can be used if unsupported sheets calls need to be made
* @see https://developers.google.com/sheets/api/reference/rest
* */
readonly sheetsApi: AxiosInstance;
/**
* Drive API [axios](https://axios-http.com) instance
* authentication automatically attached
* can be used if unsupported drive calls need to be made
* @topic permissions
* @see https://developers.google.com/drive/api/v3/reference
* */
readonly driveApi: AxiosInstance;
/**
* initialize new GoogleSpreadsheet
* @category Initialization
* */
constructor(
/** id of google spreadsheet doc */
spreadsheetId: SpreadsheetId,
/** authentication to use with Google Sheets API */
auth: GoogleApiAuth);
setRetryOptions(retries: number, retryDelay: number): void;
/** @internal */
_setAxiosRequestAuth(config: InternalAxiosRequestConfig): Promise<InternalAxiosRequestConfig<any>>;
/** @internal */
_handleAxiosResponse(response: AxiosResponse): Promise<AxiosResponse<any, any>>;
/** @internal */
_handleAxiosErrors(axiosInstance: AxiosInstance): (error: AxiosError) => Promise<unknown>;
/** @internal */
_makeSingleUpdateRequest(requestType: string, requestParams: any): Promise<any>;
/** @internal */
_makeBatchUpdateRequest(requests: any[], responseRanges?: string | string[]): Promise<void>;
/** @internal */
_ensureInfoLoaded(): void;
/** @internal */
_updateRawProperties(newProperties: SpreadsheetProperties): void;
/** @internal */
_updateOrCreateSheet(sheetInfo: {
properties: WorksheetProperties;
data: any;
}): void;
_getProp(param: keyof SpreadsheetProperties): any;
get title(): SpreadsheetProperties['title'];
get locale(): SpreadsheetProperties['locale'];
get timeZone(): SpreadsheetProperties['timeZone'];
get autoRecalc(): SpreadsheetProperties['autoRecalc'];
get defaultFormat(): SpreadsheetProperties['defaultFormat'];
get spreadsheetTheme(): SpreadsheetProperties['spreadsheetTheme'];
get iterativeCalculationSettings(): SpreadsheetProperties['iterativeCalculationSettings'];
/**
* update spreadsheet properties
* @see https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets#SpreadsheetProperties
* */
updateProperties(properties: Partial<SpreadsheetProperties>): Promise<void>;
loadInfo(includeCells?: boolean): Promise<void>;
resetLocalCache(): void;
get sheetCount(): number;
get sheetsById(): Record<WorksheetId, GoogleSpreadsheetWorksheet>;
get sheetsByIndex(): GoogleSpreadsheetWorksheet[];
get sheetsByTitle(): Record<string, GoogleSpreadsheetWorksheet>;
/**
* Add new worksheet to document
* @see https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#AddSheetRequest
* */
addSheet(properties?: Partial<RecursivePartial<WorksheetProperties> & {
headerValues: string[];
headerRowIndex: number;
}>): Promise<GoogleSpreadsheetWorksheet>;
/**
* delete a worksheet
* @see https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#DeleteSheetRequest
* */
deleteSheet(sheetId: WorksheetId): Promise<void>;
/**
* create a new named range
* @see https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#AddNamedRangeRequest
*/
addNamedRange(
/** name of new named range */
name: string,
/** GridRange object describing range */
range: GridRange,
/** id for named range (optional) */
namedRangeId?: string): Promise<any>;
/**
* delete a named range
* @see https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#DeleteNamedRangeRequest
* */
deleteNamedRange(
/** id of named range to delete */
namedRangeId: NamedRangeId): Promise<any>;
/** fetch cell data into local cache */
loadCells(
/**
* single filter or array of filters
* strings are treated as A1 ranges, objects are treated as GridRange objects
* pass nothing to fetch all cells
* */
filters?: DataFilter | DataFilter[]): Promise<void>;
/**
* export/download helper, not meant to be called directly (use downloadAsX methods on spreadsheet and worksheet instead)
* @internal
*/
_downloadAs(fileType: ExportFileTypes, worksheetId: WorksheetId | undefined, returnStreamInsteadOfBuffer?: boolean): Promise<any>;
/**
* exports entire document as html file (zipped)
* @topic export
* */
downloadAsZippedHTML(): Promise<ArrayBuffer>;
downloadAsZippedHTML(returnStreamInsteadOfBuffer: false): Promise<ArrayBuffer>;
downloadAsZippedHTML(returnStreamInsteadOfBuffer: true): Promise<Stream>;
/**
* @deprecated
* use `doc.downloadAsZippedHTML()` instead
* */
downloadAsHTML(returnStreamInsteadOfBuffer?: boolean): Promise<any>;
/**
* exports entire document as xlsx spreadsheet (Microsoft Office Excel)
* @topic export
* */
downloadAsXLSX(): Promise<ArrayBuffer>;
downloadAsXLSX(returnStreamInsteadOfBuffer: false): Promise<ArrayBuffer>;
downloadAsXLSX(returnStreamInsteadOfBuffer: true): Promise<Stream>;
/**
* exports entire document as ods spreadsheet (Open Office)
* @topic export
*/
downloadAsODS(): Promise<ArrayBuffer>;
downloadAsODS(returnStreamInsteadOfBuffer: false): Promise<ArrayBuffer>;
downloadAsODS(returnStreamInsteadOfBuffer: true): Promise<Stream>;
delete(): Promise<any>;
/**
* list all permissions entries for doc
*/
listPermissions(): Promise<PermissionsList>;
setPublicAccessLevel(role: PublicPermissionRoles | false): Promise<void>;
/** share document to email or domain */
share(emailAddressOrDomain: string, opts?: {
/** set role level, defaults to owner */
role?: PermissionRoles;
/** set to true if email is for a group */
isGroup?: boolean;
/** set to string to include a custom message, set to false to skip sending a notification altogether */
emailMessage?: string | false;
}): Promise<any>;
static createNewSpreadsheetDocument(auth: GoogleApiAuth, properties?: Partial<SpreadsheetProperties>): Promise<GoogleSpreadsheet>;
_createDeveloperMetadata(metadataKey: DeveloperMetadataKey, metadataValue: DeveloperMetadataValue, location: Partial<DeveloperMetadataLocation>, visibility?: DeveloperMetadataVisibility, metadataId?: DeveloperMetadataId): Promise<any>;
_getDeveloperMetadata(dataFilter: DeveloperMetadataDataFilter): Promise<any>;
getMetadataById(metadataId: DeveloperMetadataId): Promise<any>;
createSheetDeveloperMetadata(metadataKey: DeveloperMetadataKey, metadataValue: DeveloperMetadataValue, sheetId: WorksheetId, visibility?: DeveloperMetadataVisibility, metadataId?: DeveloperMetadataId): Promise<any>;
createRangeDeveloperMetadata(metadataKey: DeveloperMetadataKey, metadataValue: DeveloperMetadataValue, range: DimensionRange, visibility?: DeveloperMetadataVisibility, metadataId?: DeveloperMetadataId): Promise<any>;
getDeveloperMetadataByA1Range(a1Range: A1Range): Promise<any>;
getDeveloperMetadataByGridRange(gridRange: GridRange): Promise<any>;
}
export { DataValidationRule, GetValuesRequestOptions, GoogleSpreadsheet, GoogleSpreadsheetCell, GoogleSpreadsheetCellErrorValue, GoogleSpreadsheetRow, GoogleSpreadsheetWorksheet };