diff --git a/docs/classes/google-spreadsheet-worksheet.md b/docs/classes/google-spreadsheet-worksheet.md
index 4246fe9..0f25de9 100644
--- a/docs/classes/google-spreadsheet-worksheet.md
+++ b/docs/classes/google-spreadsheet-worksheet.md
@@ -289,6 +289,30 @@ Param|Type|Required|Description
- ✨ **Side effects** - new row(s) or column(s) are inserted into the sheet
- 🚨 **Warning** - Does not update cached rows/cells, so be sure to reload rows/cells before trying to make any updates to sheet contents
+### Protected Ranges
+
+#### `addProtectedRange(protectedRange)` (async) :id=fn-addProtectedRange
+> Adds a new protected range.
+
+Param|Type|Required|Description
+---|---|---|---
+`protectedRange`|Object
[ProtectedRange](https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/sheets#protectedrange)|✅|The protected range to be added. The protectedRangeId field is optional; if one is not set, an id will be randomly generated. (It is an error to specify the ID of a range that already exists.)
+
+#### `updateProtectedRange(protectedRange, fields)` (async) :id=fn-updateProtectedRange
+> Updates an existing protected range with the specified protectedRangeId.
+
+Param|Type|Required|Description
+---|---|---|---
+`protectedRange`|Object
[ProtectedRange](https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/sheets#protectedrange)|✅|The protected range to update with the new properties.
+`fields`|String|✅|The fields that should be updated. At least one field must be specified. The root protectedRange is implied and should not be specified. A single "*" can be used as short-hand for listing every field.
+
+#### `deleteProtectedRange(protectedRangeId)` (async) :id=fn-deleteProtectedRange
+> Deletes the protected range with the given ID.
+
+Param|Type|Required|Description
+---|---|---|---
+`protectedRangeId`|Number|✅|The ID of the protected range to delete.
+
### Other
#### `clear(a1Range)` (async) :id=fn-clear
diff --git a/src/lib/GoogleSpreadsheet.ts b/src/lib/GoogleSpreadsheet.ts
index 656d3f3..ccea4ad 100644
--- a/src/lib/GoogleSpreadsheet.ts
+++ b/src/lib/GoogleSpreadsheet.ts
@@ -7,7 +7,7 @@ import * as _ from './lodash';
import { GoogleSpreadsheetWorksheet } from './GoogleSpreadsheetWorksheet';
import { axiosParamsSerializer, getFieldMask } from './utils';
import {
- DataFilter, GridRange, NamedRangeId, SpreadsheetId, SpreadsheetProperties, WorksheetId, WorksheetProperties,
+ DataFilter, GridRange, NamedRangeId, ProtectedRange, SpreadsheetId, SpreadsheetProperties, WorksheetId, WorksheetProperties,
} from './types/sheets-types';
import { PermissionRoles, PermissionsList, PublicPermissionRoles } from './types/drive-types';
import { RecursivePartial } from './types/util-types';
@@ -223,13 +223,13 @@ export class GoogleSpreadsheet {
_updateRawProperties(newProperties: SpreadsheetProperties) { this._rawProperties = newProperties; }
/** @internal */
- _updateOrCreateSheet(sheetInfo: { properties: WorksheetProperties, data: any }) {
- const { properties, data } = sheetInfo;
+ _updateOrCreateSheet(sheetInfo: { properties: WorksheetProperties, data: any, protectedRanges?: ProtectedRange[] }) {
+ const { properties, data, protectedRanges } = sheetInfo;
const { sheetId } = properties;
if (!this._rawSheets[sheetId]) {
- this._rawSheets[sheetId] = new GoogleSpreadsheetWorksheet(this, properties, data);
+ this._rawSheets[sheetId] = new GoogleSpreadsheetWorksheet(this, properties, data, protectedRanges);
} else {
- this._rawSheets[sheetId].updateRawData(properties, data);
+ this._rawSheets[sheetId].updateRawData(properties, data, protectedRanges);
}
}
diff --git a/src/lib/GoogleSpreadsheetWorksheet.ts b/src/lib/GoogleSpreadsheetWorksheet.ts
index 176dbf7..0fc40e8 100644
--- a/src/lib/GoogleSpreadsheetWorksheet.ts
+++ b/src/lib/GoogleSpreadsheetWorksheet.ts
@@ -13,6 +13,8 @@ import {
RowIndex, ColumnIndex, DataFilterWithoutWorksheetId, DataFilter, GetValuesRequestOptions, WorksheetGridProperties,
WorksheetDimensionProperties, CellDataRange, AddRowOptions, GridRangeWithOptionalWorksheetId,
DataValidationRule,
+ ProtectedRange,
+ Integer,
} from './types/sheets-types';
@@ -29,6 +31,7 @@ export class GoogleSpreadsheetWorksheet {
private _cells: GoogleSpreadsheetCell[][] = [];
private _rowMetadata: any[] = [];
private _columnMetadata: any[] = [];
+ private _protectedRanges: ProtectedRange[] | null = null;
private _headerValues: string[] | undefined;
get headerValues() {
@@ -42,7 +45,8 @@ export class GoogleSpreadsheetWorksheet {
/** parent GoogleSpreadsheet instance */
readonly _spreadsheet: GoogleSpreadsheet,
rawProperties: WorksheetProperties,
- rawCellData?: CellDataRange[]
+ rawCellData?: CellDataRange[],
+ protectedRanges?: ProtectedRange[]
) {
this._headerRowIndex = 1;
@@ -53,6 +57,7 @@ export class GoogleSpreadsheetWorksheet {
this._rowMetadata = []; // 1d sparse array
this._columnMetadata = [];
+ if(protectedRanges) this._protectedRanges = protectedRanges;
if (rawCellData) this._fillCellData(rawCellData);
}
@@ -166,6 +171,7 @@ export class GoogleSpreadsheetWorksheet {
get hidden() { return this._getProp('hidden'); }
get tabColor() { return this._getProp('tabColor'); }
get rightToLeft() { return this._getProp('rightToLeft'); }
+ get protectedRanges() { return this._protectedRanges; }
private get _headerRange() {
return `A${this._headerRowIndex}:${this.lastColumnLetter}${this._headerRowIndex}`;
}
@@ -864,20 +870,43 @@ export class GoogleSpreadsheetWorksheet {
// Request type = `setBasicFilter`
// https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#SetBasicFilterRequest
}
+
+ /**
+ * Adds a new protected range.
+ * @see https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#AddProtectedRangeRequest
+ */
+ async addProtectedRange(protectedRange: ProtectedRange) {
+
- async addProtectedRange() {
- // Request type = `addProtectedRange`
- // https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#AddProtectedRangeRequest
+ // check of range definition
+ if (!protectedRange.range && !protectedRange.namedRangeId) {
+ throw new Error('No range specified: range or namedRangeId required');
+ }
+
+ return this._makeSingleUpdateRequest('addProtectedRange', {
+ protectedRange: protectedRange
+ });
}
- async updateProtectedRange() {
- // Request type = `updateProtectedRange`
- // https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#UpdateProtectedRangeRequest
+ /**
+ * Updates an existing protected range with the specified protectedRangeId.
+ * @see https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#UpdateProtectedRangeRequest
+ */
+ async updateProtectedRange(protectedRange: ProtectedRange, fields: string) {
+ return this._makeSingleUpdateRequest('updateProtectedRange', {
+ protectedRange: protectedRange,
+ fields: fields
+ });
}
- async deleteProtectedRange() {
- // Request type = `deleteProtectedRange`
- // https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#DeleteProtectedRangeRequest
+ /**
+ * Deletes the protected range with the given ID.
+ * @see https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#DeleteProtectedRangeRequest
+ */
+ async deleteProtectedRange(protectedRangeId: Integer) {
+ return this._makeSingleUpdateRequest('deleteProtectedRange', {
+ protectedRangeId: protectedRangeId
+ });
}
async autoResizeDimensions() {
diff --git a/src/lib/types/sheets-types.ts b/src/lib/types/sheets-types.ts
index 3777d59..bfdee6e 100644
--- a/src/lib/types/sheets-types.ts
+++ b/src/lib/types/sheets-types.ts
@@ -413,6 +413,41 @@ export type GridRangeWithOptionalWorksheetId = MakeOptional