microsoft-graph 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.editorconfig +18 -0
- package/.gitattributes +46 -0
- package/.vscode/extensions.json +3 -0
- package/.vscode/launch.json +15 -0
- package/.vscode/settings.json +15 -0
- package/CONTRIBUTING.md +2 -0
- package/LICENCE.md +360 -0
- package/README.md +52 -0
- package/biome.jsonc +83 -0
- package/dist/errors/BadTemplateError.js +6 -0
- package/dist/errors/EnvironmentVariableMissingError.js +6 -0
- package/dist/errors/InvalidArgumentError.js +21 -0
- package/dist/errors/ProtocolError.js +11 -0
- package/dist/errors/RequestFailedError.js +21 -0
- package/dist/graphApi.js +116 -0
- package/dist/index.js +2 -0
- package/dist/models/AccessToken.js +1 -0
- package/dist/models/DriveId.js +1 -0
- package/dist/models/DriveItemId.js +1 -0
- package/dist/models/DriveItemPath.js +1 -0
- package/dist/models/DriveItemRef.js +1 -0
- package/dist/models/DriveRef.js +1 -0
- package/dist/models/GraphOperation.js +1 -0
- package/dist/models/GraphOperationDefinition.js +1 -0
- package/dist/models/HostName.js +1 -0
- package/dist/models/Scope.js +1 -0
- package/dist/models/SiteId.js +1 -0
- package/dist/models/SiteName.js +1 -0
- package/dist/models/SiteRef.js +1 -0
- package/dist/models/WorkbookNamedRangeRef.js +1 -0
- package/dist/models/WorkbookRangeAddress.js +1 -0
- package/dist/models/WorkbookRangeName.js +1 -0
- package/dist/models/WorkbookRangeRef.js +1 -0
- package/dist/models/WorkbookRef.js +1 -0
- package/dist/models/WorkbookSessionId.js +1 -0
- package/dist/models/WorkbookTableId.js +1 -0
- package/dist/models/WorkbookTableRef.js +1 -0
- package/dist/models/WorkbookWorksheetId.js +1 -0
- package/dist/models/WorkbookWorksheetName.js +1 -0
- package/dist/models/WorkbookWorksheetRef.js +1 -0
- package/dist/operations/drive/createFolder.js +27 -0
- package/dist/operations/drive/createFolder.test.js +31 -0
- package/dist/operations/drive/listDrives.js +23 -0
- package/dist/operations/drive/listDrives.test.js +9 -0
- package/dist/operations/driveItem/copyDriveItem.js +21 -0
- package/dist/operations/driveItem/copyDriveItem.test.js +28 -0
- package/dist/operations/driveItem/deleteDriveItem.js +12 -0
- package/dist/operations/driveItem/deleteDriveItem.test.js +22 -0
- package/dist/operations/driveItem/getDriveItem.js +18 -0
- package/dist/operations/driveItem/getDriveItem.test.js +24 -0
- package/dist/operations/driveItem/getDriveItemByPath.js +20 -0
- package/dist/operations/driveItem/getDriveItemByPath.test.js +22 -0
- package/dist/operations/driveItem/getDriveItemContent.js +22 -0
- package/dist/operations/driveItem/getDriveItemContent.test.js +37 -0
- package/dist/operations/driveItem/listDriveItems.js +25 -0
- package/dist/operations/driveItem/listDriveItems.test.js +24 -0
- package/dist/operations/site/getSite.js +18 -0
- package/dist/operations/site/getSite.test.js +15 -0
- package/dist/operations/site/getSiteByName.js +20 -0
- package/dist/operations/site/getSiteByName.test.js +20 -0
- package/dist/operations/site/listSites.js +23 -0
- package/dist/operations/site/listSites.test.js +10 -0
- package/dist/operations/site/searchSites.js +23 -0
- package/dist/operations/site/searchSites.test.js +21 -0
- package/dist/operations/workbook/calculateWorkbook.js +20 -0
- package/dist/operations/workbook/calculateWorkbook.test.js +46 -0
- package/dist/operations/workbook/createWorkbook.js +26 -0
- package/dist/operations/workbook/createWorkbook.test.js +15 -0
- package/dist/operations/workbook/deleteWorkbook.js +5 -0
- package/dist/operations/workbookRange/clearWorkbookRange.js +17 -0
- package/dist/operations/workbookRange/clearWorkbookRange.test.js +56 -0
- package/dist/operations/workbookRange/deleteWorkbookRange.js +17 -0
- package/dist/operations/workbookRange/deleteWorkbookRange.test.js +56 -0
- package/dist/operations/workbookRange/getWorkbookNamedRange.js +20 -0
- package/dist/operations/workbookRange/getWorkbookUsedRange.js +22 -0
- package/dist/operations/workbookRange/getWorkbookUsedRange.test.js +54 -0
- package/dist/operations/workbookRange/getWorkbookVisibleRange.js +20 -0
- package/dist/operations/workbookRange/getWorkbookVisibleRange.test.js +109 -0
- package/dist/operations/workbookRange/insertWorkbookCells.js +25 -0
- package/dist/operations/workbookRange/insertWorkbookCells.test.js +41 -0
- package/dist/operations/workbookRange/updateWorkbookNamedRange.js +15 -0
- package/dist/operations/workbookRange/updateWorkbookRange.js +21 -0
- package/dist/operations/workbookRange/updateWorkbookRange.test.js +54 -0
- package/dist/operations/workbookSession/closeWorkbookSession.js +18 -0
- package/dist/operations/workbookSession/createWorkbookSession.js +22 -0
- package/dist/operations/workbookSession/refreshWorkbookSession.js +19 -0
- package/dist/operations/workbookTable/createWorkbookTable.js +26 -0
- package/dist/operations/workbookTable/createWorkbookTable.test.js +25 -0
- package/dist/operations/workbookTable/getWorkbookTable.js +20 -0
- package/dist/operations/workbookTable/getWorkbookTable.test.js +30 -0
- package/dist/operations/workbookTable/getWorkbookTableBodyRange.js +22 -0
- package/dist/operations/workbookTable/getWorkbookTableBodyRange.test.js +45 -0
- package/dist/operations/workbookTable/getWorkbookTableHeaderRange.js +22 -0
- package/dist/operations/workbookTable/getWorkbookTableHeaderRange.test.js +41 -0
- package/dist/operations/workbookTable/listWorkbookTableColumns.js +17 -0
- package/dist/operations/workbookTable/listWorkbookTableColumns.test.js +29 -0
- package/dist/operations/workbookTable/listWorkbookTableRows.js +17 -0
- package/dist/operations/workbookTable/listWorkbookTableRows.test.js +29 -0
- package/dist/operations/workbookTable/listWorkbookTables.js +25 -0
- package/dist/operations/workbookTable/listWorkbookTables.test.js +30 -0
- package/dist/operations/workbookWorksheet/createWorkbookWorksheet.js +25 -0
- package/dist/operations/workbookWorksheet/createWorkbookWorksheet.test.js +36 -0
- package/dist/operations/workbookWorksheet/deleteWorkbookWorksheet.js +14 -0
- package/dist/operations/workbookWorksheet/deleteWorkbookWorksheet.test.js +28 -0
- package/dist/operations/workbookWorksheet/getWorkbookWorksheetRange.js +20 -0
- package/dist/operations/workbookWorksheet/getWorkbookWorksheetRange.test.js +30 -0
- package/dist/operations/workbookWorksheet/listWorkbookWorksheets.js +28 -0
- package/dist/operations/workbookWorksheet/listWorkbookWorksheets.test.js +45 -0
- package/dist/operations/workbookWorksheet/updateWorkbookWorksheet.js +21 -0
- package/dist/operations/workbookWorksheet/updateWorkbookWorksheet.test.js +37 -0
- package/dist/services/accessToken.js +15 -0
- package/dist/services/address.js +3 -0
- package/dist/services/configuration.js +20 -0
- package/dist/services/drive.js +17 -0
- package/dist/services/driveItem.js +48 -0
- package/dist/services/driveItem.test.js +17 -0
- package/dist/services/httpAgent.js +9 -0
- package/dist/services/httpStatus.js +3 -0
- package/dist/services/operationId.js +6 -0
- package/dist/services/sharepointUrl.js +24 -0
- package/dist/services/sharepointUrl.test.js +32 -0
- package/dist/services/site.js +15 -0
- package/dist/services/sleep.js +3 -0
- package/dist/services/stringCaseConversion.js +5 -0
- package/dist/services/stringCaseConversion.test.js +16 -0
- package/dist/services/templatedPaths.js +20 -0
- package/dist/services/templatedPaths.test.js +49 -0
- package/dist/services/temporaryFiles.js +11 -0
- package/dist/services/workbookRange.js +10 -0
- package/dist/services/workbookRangeAddress.js +8 -0
- package/dist/services/workbookTable.js +13 -0
- package/dist/services/workbookWorksheet.js +13 -0
- package/dist/tasks/createWorkbookAndStartSession.js +10 -0
- package/dist/tasks/deleteDriveItemWithRetry.js +16 -0
- package/dist/tasks/downloadDriveItemContent.js +7 -0
- package/dist/tasks/endSessionAndDeleteWorkbook.js +6 -0
- package/dist/tasks/getRangeLastUsedCell.js +38 -0
- package/dist/tasks/getRangeLastUsedCell.test.js +89 -0
- package/dist/tasks/getWorkbookTableVisibleBody.js +24 -0
- package/dist/tasks/getWorkbookTableVisibleBody.test.js +104 -0
- package/dist/tasks/getWorkbookWorksheetRefByName.js +10 -0
- package/dist/tasks/setColumnHidden.js +7 -0
- package/dist/tasks/setColumnHidden.test.js +43 -0
- package/dist/tasks/setRowHidden.js +7 -0
- package/dist/tasks/setRowHidden.test.js +42 -0
- package/docs/approach.md +7 -0
- package/docs/calculateWorkbook.md +20 -0
- package/docs/concepts.md +4 -0
- package/docs/envs.md +11 -0
- package/docs/performance.md +24 -0
- package/package.json +426 -0
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { getDefaultDriveRef } from "../../services/drive.js";
|
|
3
|
+
import { driveItemPath, } from "../../services/driveItem.js";
|
|
4
|
+
import { generateTempFileName } from "../../services/temporaryFiles.js";
|
|
5
|
+
import { workbookRangeRef } from "../../services/workbookRange.js";
|
|
6
|
+
import { defaultWorkbookWorksheetId, workbookWorksheetRef } from "../../services/workbookWorksheet.js";
|
|
7
|
+
import deleteDriveItemWithRetry from "../../tasks/deleteDriveItemWithRetry.js";
|
|
8
|
+
import calculateWorkbook from "../workbook/calculateWorkbook.js";
|
|
9
|
+
import createWorkbook from "../workbook/createWorkbook.js";
|
|
10
|
+
import getWorkbookUsedRange from "./getWorkbookUsedRange.js";
|
|
11
|
+
import insertWorkbookCells from "./insertWorkbookCells.js";
|
|
12
|
+
import updateWorkbookRange from "./updateWorkbookRange.js";
|
|
13
|
+
describe("insertWorkbookCells", () => {
|
|
14
|
+
it("can insert cells in an existing workbook using sequential", { timeout: 20000 }, async () => {
|
|
15
|
+
const address = "A1:B2";
|
|
16
|
+
const initialValues = [
|
|
17
|
+
[1, 2],
|
|
18
|
+
[3, 4]
|
|
19
|
+
];
|
|
20
|
+
const finalValues = [
|
|
21
|
+
["", 2],
|
|
22
|
+
[1, 4],
|
|
23
|
+
[3, ""]
|
|
24
|
+
];
|
|
25
|
+
const workbookName = generateTempFileName("xlsx");
|
|
26
|
+
const workbookPath = driveItemPath(workbookName);
|
|
27
|
+
const workbook = await createWorkbook(getDefaultDriveRef(), workbookPath);
|
|
28
|
+
const worksheetRef = workbookWorksheetRef(workbook, defaultWorkbookWorksheetId);
|
|
29
|
+
const rangeRef = workbookRangeRef(worksheetRef, address);
|
|
30
|
+
try {
|
|
31
|
+
await updateWorkbookRange(rangeRef, { values: initialValues });
|
|
32
|
+
await insertWorkbookCells(worksheetRef, "A1", "Down");
|
|
33
|
+
await calculateWorkbook(workbook);
|
|
34
|
+
const insertedRange = await getWorkbookUsedRange(rangeRef);
|
|
35
|
+
expect(insertedRange.values).toEqual(finalValues);
|
|
36
|
+
}
|
|
37
|
+
finally {
|
|
38
|
+
await deleteDriveItemWithRetry(workbook);
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
});
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { operation } from "../../graphApi.js";
|
|
2
|
+
import { generatePath } from "../../services/templatedPaths.js";
|
|
3
|
+
/** Update range that has been defined using the "named range" functionality. Properties that aren't included in the request maintain their previous values or are recalculated based on changes to other property values. @see https://learn.microsoft.com/en-us/graph/api/range-update */
|
|
4
|
+
export default function updateWorkbookNamedRange(rangeRef, value) {
|
|
5
|
+
return operation({
|
|
6
|
+
method: "PATCH",
|
|
7
|
+
path: generatePath("/sites/{site-id}/drives/{drive-id}/items/{item-id}/workbook/names/{range-name}/range", rangeRef),
|
|
8
|
+
headers: {
|
|
9
|
+
"workbook-session-id": rangeRef.sessionId,
|
|
10
|
+
"content-type": "application/json",
|
|
11
|
+
},
|
|
12
|
+
body: value,
|
|
13
|
+
responseTransform: () => undefined
|
|
14
|
+
});
|
|
15
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { operation } from "../../graphApi.js";
|
|
2
|
+
import { generatePath } from "../../services/templatedPaths.js";
|
|
3
|
+
/** Update range, including values and formatting. Properties that aren't included in the request maintain their previous values or are recalculated based on changes to other property values. @see https://learn.microsoft.com/en-us/graph/api/range-update */
|
|
4
|
+
export default function updateWorkbookRange(rangeRef, update) {
|
|
5
|
+
return operation({
|
|
6
|
+
method: "PATCH",
|
|
7
|
+
path: generatePath(`/sites/{site-id}/drives/{drive-id}/items/{item-id}/workbook/worksheets/{worksheet-id}/range(address='${rangeRef.address}')`, rangeRef),
|
|
8
|
+
headers: {
|
|
9
|
+
"workbook-session-id": rangeRef.sessionId,
|
|
10
|
+
"content-type": "application/json",
|
|
11
|
+
},
|
|
12
|
+
body: update,
|
|
13
|
+
responseTransform: response => {
|
|
14
|
+
const range = response;
|
|
15
|
+
return {
|
|
16
|
+
...range,
|
|
17
|
+
...rangeRef
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { sequential } from "../../graphApi.js";
|
|
3
|
+
import { getDefaultDriveRef } from "../../services/drive.js";
|
|
4
|
+
import { driveItemPath, } from "../../services/driveItem.js";
|
|
5
|
+
import { generateTempFileName } from "../../services/temporaryFiles.js";
|
|
6
|
+
import { workbookRangeRef } from "../../services/workbookRange.js";
|
|
7
|
+
import { defaultWorkbookWorksheetId, workbookWorksheetRef } from "../../services/workbookWorksheet.js";
|
|
8
|
+
import deleteDriveItemWithRetry from "../../tasks/deleteDriveItemWithRetry.js";
|
|
9
|
+
import calculateWorkbook from "../workbook/calculateWorkbook.js";
|
|
10
|
+
import createWorkbook from "../workbook/createWorkbook.js";
|
|
11
|
+
import getWorkbookWorksheetRange from "../workbookWorksheet/getWorkbookWorksheetRange.js";
|
|
12
|
+
import updateWorkbookRange from "./updateWorkbookRange.js";
|
|
13
|
+
describe("updateWorkbookRange", () => {
|
|
14
|
+
it("can update a range in an existing workbook", { timeout: 10000 }, async () => {
|
|
15
|
+
const address = "A1:B2";
|
|
16
|
+
const values = [[1, 2], [3, 4]];
|
|
17
|
+
const workbookName = generateTempFileName("xlsx");
|
|
18
|
+
const workbookPath = driveItemPath(workbookName);
|
|
19
|
+
const driveRef = getDefaultDriveRef();
|
|
20
|
+
const workbook = await createWorkbook(driveRef, workbookPath);
|
|
21
|
+
const worksheetRef = workbookWorksheetRef(workbook, defaultWorkbookWorksheetId);
|
|
22
|
+
const rangeRef = workbookRangeRef(worksheetRef, address);
|
|
23
|
+
try {
|
|
24
|
+
await updateWorkbookRange(rangeRef, {
|
|
25
|
+
values: values
|
|
26
|
+
});
|
|
27
|
+
await calculateWorkbook(workbook);
|
|
28
|
+
const updatedRange = await getWorkbookWorksheetRange(rangeRef);
|
|
29
|
+
expect(updatedRange.values).toEqual(values);
|
|
30
|
+
}
|
|
31
|
+
finally {
|
|
32
|
+
await deleteDriveItemWithRetry(workbook);
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
it("can update a range in an existing workbook sequential", { timeout: 10000 }, async () => {
|
|
36
|
+
const address = "A1:B2";
|
|
37
|
+
const values = [[1, 2], [3, 4]];
|
|
38
|
+
const workbookName = generateTempFileName("xlsx");
|
|
39
|
+
const workbookPath = driveItemPath(workbookName);
|
|
40
|
+
const driveRef = getDefaultDriveRef();
|
|
41
|
+
const workbook = await createWorkbook(driveRef, workbookPath);
|
|
42
|
+
const worksheetRef = workbookWorksheetRef(workbook, defaultWorkbookWorksheetId);
|
|
43
|
+
const rangeRef = workbookRangeRef(worksheetRef, address);
|
|
44
|
+
try {
|
|
45
|
+
const [_, __, updatedRange] = await sequential(updateWorkbookRange(rangeRef, {
|
|
46
|
+
values: values
|
|
47
|
+
}), calculateWorkbook(workbook), getWorkbookWorksheetRange(rangeRef));
|
|
48
|
+
expect(updatedRange.values).toEqual(values);
|
|
49
|
+
}
|
|
50
|
+
finally {
|
|
51
|
+
await deleteDriveItemWithRetry(workbook);
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
});
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import InvalidArgumentError from "../../errors/InvalidArgumentError.js";
|
|
2
|
+
import { operation } from "../../graphApi.js";
|
|
3
|
+
import { generatePath } from "../../services/templatedPaths.js";
|
|
4
|
+
/** Close an existing workbook session. @see https://learn.microsoft.com/en-us/graph/api/workbook-closesession */
|
|
5
|
+
export default function closeWorkbookSession(workbookRef) {
|
|
6
|
+
if (!workbookRef.sessionId) {
|
|
7
|
+
throw new InvalidArgumentError("Workbook session ID is required to close a session.");
|
|
8
|
+
}
|
|
9
|
+
return operation({
|
|
10
|
+
method: "POST",
|
|
11
|
+
path: generatePath("/sites/{site-id}/drives/{drive-id}/items/{item-id}/workbook/closeSession", workbookRef),
|
|
12
|
+
headers: {
|
|
13
|
+
"workbook-session-id": workbookRef.sessionId,
|
|
14
|
+
},
|
|
15
|
+
body: null,
|
|
16
|
+
responseTransform: () => undefined
|
|
17
|
+
});
|
|
18
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { operation } from "../../graphApi.js";
|
|
2
|
+
import { generatePath } from "../../services/templatedPaths.js";
|
|
3
|
+
/** Create a new workbook session. Typically the persistent session expires after about 5 minutes of inactivity. Non persistent session expires after about 7 minutes of inactivity. Most performant with `persistChanges = true`. @see https://learn.microsoft.com/en-us/graph/api/workbook-createsession @see https://learn.microsoft.com/en-us/graph/api/resources/excel#usage */
|
|
4
|
+
export default function createWorkbookSession(itemRef, persistChanges = true) {
|
|
5
|
+
return operation({
|
|
6
|
+
method: "POST",
|
|
7
|
+
path: generatePath("/sites/{site-id}/drives/{drive-id}/items/{item-id}/workbook/createSession", itemRef),
|
|
8
|
+
headers: {
|
|
9
|
+
"content-type": "application/json",
|
|
10
|
+
},
|
|
11
|
+
body: {
|
|
12
|
+
persistChanges
|
|
13
|
+
},
|
|
14
|
+
responseTransform: response => {
|
|
15
|
+
const session = response;
|
|
16
|
+
return ({
|
|
17
|
+
...itemRef,
|
|
18
|
+
sessionId: session.id,
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import InvalidArgumentError from "../../errors/InvalidArgumentError.js";
|
|
2
|
+
import { operation } from "../../graphApi.js";
|
|
3
|
+
import { generatePath } from "../../services/templatedPaths.js";
|
|
4
|
+
/** Refresh a workbook session. @see https://learn.microsoft.com/en-us/graph/api/workbook-refreshsession */
|
|
5
|
+
export default function refreshWorkbookSession(workbookRef) {
|
|
6
|
+
if (!workbookRef.sessionId) {
|
|
7
|
+
throw new InvalidArgumentError("Workbook session ID is required to refresh a session.");
|
|
8
|
+
}
|
|
9
|
+
return operation({
|
|
10
|
+
method: "POST",
|
|
11
|
+
path: generatePath("/sites/{site-id}/drives/{drive-id}/items/{item-id}/workbook/refreshSession", workbookRef),
|
|
12
|
+
headers: {
|
|
13
|
+
"workbook-session-id": workbookRef.sessionId,
|
|
14
|
+
"content-type": "application/json",
|
|
15
|
+
},
|
|
16
|
+
body: null,
|
|
17
|
+
responseTransform: () => undefined
|
|
18
|
+
});
|
|
19
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { operation } from "../../graphApi.js";
|
|
2
|
+
import { generatePath } from "../../services/templatedPaths.js";
|
|
3
|
+
import { workbookTableRef } from "../../services/workbookTable.js";
|
|
4
|
+
/** Create a new table in a worksheet. @see https://learn.microsoft.com/en-us/graph/api/worksheet-post-tables */
|
|
5
|
+
export default function createWorkbookTable(rangeRef, hasHeaders) {
|
|
6
|
+
return operation({
|
|
7
|
+
method: "POST",
|
|
8
|
+
path: generatePath("/sites/{site-id}/drives/{drive-id}/items/{item-id}/workbook/worksheets/{worksheet-id}/tables/add", rangeRef),
|
|
9
|
+
headers: {
|
|
10
|
+
"workbook-session-id": rangeRef.sessionId,
|
|
11
|
+
"content-type": "application/json",
|
|
12
|
+
},
|
|
13
|
+
body: {
|
|
14
|
+
address: rangeRef.address,
|
|
15
|
+
hasHeaders
|
|
16
|
+
},
|
|
17
|
+
responseTransform: response => {
|
|
18
|
+
const table = response;
|
|
19
|
+
const tableRef = workbookTableRef(rangeRef, table.id);
|
|
20
|
+
return {
|
|
21
|
+
...table,
|
|
22
|
+
...tableRef
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { getDefaultDriveRef } from "../../services/drive.js";
|
|
3
|
+
import { driveItemPath, } from "../../services/driveItem.js";
|
|
4
|
+
import { generateTempFileName } from "../../services/temporaryFiles.js";
|
|
5
|
+
import { workbookRangeRef } from "../../services/workbookRange.js";
|
|
6
|
+
import deleteDriveItemWithRetry from "../../tasks/deleteDriveItemWithRetry.js";
|
|
7
|
+
import createWorkbook from "../workbook/createWorkbook.js";
|
|
8
|
+
import createWorkbookWorksheet from "../workbookWorksheet/createWorkbookWorksheet.js";
|
|
9
|
+
import createWorkbookTable from "./createWorkbookTable.js";
|
|
10
|
+
describe("createWorkbookTable", () => {
|
|
11
|
+
it("can create a new table in an existing worksheet", { timeout: 10000 }, async () => {
|
|
12
|
+
const workbookName = generateTempFileName("xlsx");
|
|
13
|
+
const workbookPath = driveItemPath(workbookName);
|
|
14
|
+
const workbook = await createWorkbook(getDefaultDriveRef(), workbookPath);
|
|
15
|
+
try {
|
|
16
|
+
const worksheet = await createWorkbookWorksheet(workbook);
|
|
17
|
+
const rangeRef = workbookRangeRef(worksheet, "A1:D4");
|
|
18
|
+
const table = await createWorkbookTable(rangeRef, true);
|
|
19
|
+
expect(table.id).toBeTruthy();
|
|
20
|
+
}
|
|
21
|
+
finally {
|
|
22
|
+
await deleteDriveItemWithRetry(workbook);
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
});
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { operation } from "../../graphApi.js";
|
|
2
|
+
import { generatePath } from "../../services/templatedPaths.js";
|
|
3
|
+
/** Retrieve a table by its ID. @see https://learn.microsoft.com/en-us/graph/api/table-get */
|
|
4
|
+
export default function getWorkbookTable(tableRef) {
|
|
5
|
+
return operation({
|
|
6
|
+
method: "GET",
|
|
7
|
+
path: generatePath("/sites/{site-id}/drives/{drive-id}/items/{item-id}/workbook/worksheets/{worksheet-id}/tables/{table-id}", tableRef),
|
|
8
|
+
headers: {
|
|
9
|
+
"workbook-session-id": tableRef.sessionId,
|
|
10
|
+
},
|
|
11
|
+
body: null,
|
|
12
|
+
responseTransform: response => {
|
|
13
|
+
const table = response;
|
|
14
|
+
return {
|
|
15
|
+
...table,
|
|
16
|
+
...tableRef
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { getDefaultDriveRef } from "../../services/drive.js";
|
|
3
|
+
import { driveItemPath, } from "../../services/driveItem.js";
|
|
4
|
+
import { generateTempFileName } from "../../services/temporaryFiles.js";
|
|
5
|
+
import { workbookRangeRef } from "../../services/workbookRange.js";
|
|
6
|
+
import deleteDriveItemWithRetry from "../../tasks/deleteDriveItemWithRetry.js";
|
|
7
|
+
import calculateWorkbook from "../workbook/calculateWorkbook.js";
|
|
8
|
+
import createWorkbook from "../workbook/createWorkbook.js";
|
|
9
|
+
import createWorkbookWorksheet from "../workbookWorksheet/createWorkbookWorksheet.js";
|
|
10
|
+
import createWorkbookTable from "./createWorkbookTable.js";
|
|
11
|
+
import getWorkbookTable from "./getWorkbookTable.js";
|
|
12
|
+
describe("getWorkbookTable", () => {
|
|
13
|
+
it("can retrieve a table by its ID", { timeout: 10000 }, async () => {
|
|
14
|
+
const workbookName = generateTempFileName("xlsx");
|
|
15
|
+
const workbookPath = driveItemPath(workbookName);
|
|
16
|
+
const driveRef = getDefaultDriveRef();
|
|
17
|
+
const workbook = await createWorkbook(driveRef, workbookPath);
|
|
18
|
+
try {
|
|
19
|
+
const worksheet = await createWorkbookWorksheet(workbook);
|
|
20
|
+
const rangeRef = workbookRangeRef(worksheet, "A1:D4");
|
|
21
|
+
const table = await createWorkbookTable(rangeRef, true);
|
|
22
|
+
await calculateWorkbook(workbook);
|
|
23
|
+
const retrievedTable = await getWorkbookTable(table);
|
|
24
|
+
expect(retrievedTable.tableId).toBe(table.tableId);
|
|
25
|
+
}
|
|
26
|
+
finally {
|
|
27
|
+
await deleteDriveItemWithRetry(workbook);
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
});
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { operation } from "../../graphApi.js";
|
|
2
|
+
import { generatePath } from "../../services/templatedPaths.js";
|
|
3
|
+
import { workbookRangeRef } from "../../services/workbookRange.js";
|
|
4
|
+
/** Retrieve the data body range of a table. @see https://learn.microsoft.com/en-us/graph/api/table-databodyrange */
|
|
5
|
+
export default function getWorkbookTableBodyRange(tableRef) {
|
|
6
|
+
return operation({
|
|
7
|
+
method: "GET",
|
|
8
|
+
path: generatePath("/sites/{site-id}/drives/{drive-id}/items/{item-id}/workbook/worksheets/{worksheet-id}/tables/{table-id}/dataBodyRange", tableRef),
|
|
9
|
+
headers: {
|
|
10
|
+
"workbook-session-id": tableRef.sessionId,
|
|
11
|
+
},
|
|
12
|
+
body: null,
|
|
13
|
+
responseTransform: response => {
|
|
14
|
+
const range = response;
|
|
15
|
+
const rangeRef = workbookRangeRef(tableRef, range.address);
|
|
16
|
+
return {
|
|
17
|
+
...range,
|
|
18
|
+
...rangeRef
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { sequential } from "../../graphApi.js";
|
|
3
|
+
import { getDefaultDriveRef } from "../../services/drive.js";
|
|
4
|
+
import { driveItemPath } from "../../services/driveItem.js";
|
|
5
|
+
import { generateTempFileName } from "../../services/temporaryFiles.js";
|
|
6
|
+
import { workbookRangeRef } from "../../services/workbookRange.js";
|
|
7
|
+
import deleteDriveItemWithRetry from "../../tasks/deleteDriveItemWithRetry.js";
|
|
8
|
+
import calculateWorkbook from "../workbook/calculateWorkbook.js";
|
|
9
|
+
import createWorkbook from "../workbook/createWorkbook.js";
|
|
10
|
+
import updateWorkbookRange from "../workbookRange/updateWorkbookRange.js";
|
|
11
|
+
import createWorkbookWorksheet from "../workbookWorksheet/createWorkbookWorksheet.js";
|
|
12
|
+
import createWorkbookTable from "./createWorkbookTable.js";
|
|
13
|
+
import getWorkbookTableBodyRange from "./getWorkbookTableBodyRange.js";
|
|
14
|
+
describe("getWorkbookTableBodyRange", () => {
|
|
15
|
+
it("can retrieve the data body range of a table", { timeout: 10000 }, async () => {
|
|
16
|
+
const workbookName = generateTempFileName("xlsx");
|
|
17
|
+
const workbookPath = driveItemPath(workbookName);
|
|
18
|
+
const driveRef = getDefaultDriveRef();
|
|
19
|
+
const workbook = await createWorkbook(driveRef, workbookPath);
|
|
20
|
+
try {
|
|
21
|
+
const worksheet = await createWorkbookWorksheet(workbook);
|
|
22
|
+
const rangeRef = workbookRangeRef(worksheet, "A1:D4");
|
|
23
|
+
const table = await createWorkbookTable(rangeRef, true);
|
|
24
|
+
await updateWorkbookRange(rangeRef, {
|
|
25
|
+
values: [
|
|
26
|
+
["Header1", "Header2", "Header3", "Header4"],
|
|
27
|
+
["Value1", "Value2", "Value3", "Value4"],
|
|
28
|
+
["Value5", "Value6", "Value7", "Value8"],
|
|
29
|
+
["Value9", "Value10", "Value11", "Value12"]
|
|
30
|
+
]
|
|
31
|
+
});
|
|
32
|
+
await calculateWorkbook(workbook);
|
|
33
|
+
const [_, dataBodyRange] = await sequential(calculateWorkbook(workbook), getWorkbookTableBodyRange(table));
|
|
34
|
+
expect(dataBodyRange.address).toBeTruthy();
|
|
35
|
+
expect(dataBodyRange.values).toEqual([
|
|
36
|
+
["Value1", "Value2", "Value3", "Value4"],
|
|
37
|
+
["Value5", "Value6", "Value7", "Value8"],
|
|
38
|
+
["Value9", "Value10", "Value11", "Value12"]
|
|
39
|
+
]);
|
|
40
|
+
}
|
|
41
|
+
finally {
|
|
42
|
+
await deleteDriveItemWithRetry(workbook);
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
});
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { operation } from "../../graphApi.js";
|
|
2
|
+
import { generatePath } from "../../services/templatedPaths.js";
|
|
3
|
+
import { workbookRangeRef } from "../../services/workbookRange.js";
|
|
4
|
+
/** Retrieve the header row range of a table. @see https://learn.microsoft.com/en-us/graph/api/table-headerrowrange */
|
|
5
|
+
export default function getWorkbookTableHeaderRange(tableRef) {
|
|
6
|
+
return operation({
|
|
7
|
+
method: "GET",
|
|
8
|
+
path: generatePath("/sites/{site-id}/drives/{drive-id}/items/{item-id}/workbook/worksheets/{worksheet-id}/tables/{table-id}/headerRowRange", tableRef),
|
|
9
|
+
headers: {
|
|
10
|
+
"workbook-session-id": tableRef.sessionId,
|
|
11
|
+
},
|
|
12
|
+
body: null,
|
|
13
|
+
responseTransform: response => {
|
|
14
|
+
const range = response;
|
|
15
|
+
const rangeRef = workbookRangeRef(tableRef, range.address);
|
|
16
|
+
return {
|
|
17
|
+
...range,
|
|
18
|
+
...rangeRef
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { sequential } from "../../graphApi.js";
|
|
3
|
+
import { getDefaultDriveRef } from "../../services/drive.js";
|
|
4
|
+
import { driveItemPath } from "../../services/driveItem.js";
|
|
5
|
+
import { generateTempFileName } from "../../services/temporaryFiles.js";
|
|
6
|
+
import { workbookRangeRef } from "../../services/workbookRange.js";
|
|
7
|
+
import deleteDriveItemWithRetry from "../../tasks/deleteDriveItemWithRetry.js";
|
|
8
|
+
import calculateWorkbook from "../workbook/calculateWorkbook.js";
|
|
9
|
+
import createWorkbook from "../workbook/createWorkbook.js";
|
|
10
|
+
import updateWorkbookRange from "../workbookRange/updateWorkbookRange.js";
|
|
11
|
+
import createWorkbookWorksheet from "../workbookWorksheet/createWorkbookWorksheet.js";
|
|
12
|
+
import createWorkbookTable from "./createWorkbookTable.js";
|
|
13
|
+
import getWorkbookTableHeaderRange from "./getWorkbookTableHeaderRange.js";
|
|
14
|
+
describe("getWorkbookTableHeaderRange", () => {
|
|
15
|
+
it("can retrieve the header row range of a table", { timeout: 10000 }, async () => {
|
|
16
|
+
const workbookName = generateTempFileName("xlsx");
|
|
17
|
+
const workbookPath = driveItemPath(workbookName);
|
|
18
|
+
const driveRef = getDefaultDriveRef();
|
|
19
|
+
const workbook = await createWorkbook(driveRef, workbookPath);
|
|
20
|
+
try {
|
|
21
|
+
const worksheet = await createWorkbookWorksheet(workbook);
|
|
22
|
+
const rangeRef = workbookRangeRef(worksheet, "A1:D4");
|
|
23
|
+
const table = await createWorkbookTable(rangeRef, true);
|
|
24
|
+
await updateWorkbookRange(rangeRef, {
|
|
25
|
+
values: [
|
|
26
|
+
["Header1", "Header2", "Header3", "Header4"],
|
|
27
|
+
["Value1", "Value2", "Value3", "Value4"],
|
|
28
|
+
["Value5", "Value6", "Value7", "Value8"],
|
|
29
|
+
["Value9", "Value10", "Value11", "Value12"]
|
|
30
|
+
]
|
|
31
|
+
});
|
|
32
|
+
await calculateWorkbook(workbook);
|
|
33
|
+
const [_, headerRange] = await sequential(calculateWorkbook(workbook), getWorkbookTableHeaderRange(table));
|
|
34
|
+
expect(headerRange.address).toBeTruthy();
|
|
35
|
+
expect(headerRange.values).toEqual([["Header1", "Header2", "Header3", "Header4"]]);
|
|
36
|
+
}
|
|
37
|
+
finally {
|
|
38
|
+
await deleteDriveItemWithRetry(workbook);
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
});
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { operation } from "../../graphApi.js";
|
|
2
|
+
import { generatePath } from "../../services/templatedPaths.js";
|
|
3
|
+
/** Retrieve a list of columns in a table. @see https://learn.microsoft.com/en-us/graph/api/tablecolumn-list */
|
|
4
|
+
export default function listWorkbookTableColumns(tableRef) {
|
|
5
|
+
return operation({
|
|
6
|
+
method: "GET",
|
|
7
|
+
path: generatePath("/sites/{site-id}/drives/{drive-id}/items/{item-id}/workbook/tables/{table-id}/columns", tableRef),
|
|
8
|
+
headers: {
|
|
9
|
+
"workbook-session-id": tableRef.sessionId,
|
|
10
|
+
},
|
|
11
|
+
body: null,
|
|
12
|
+
responseTransform: response => {
|
|
13
|
+
const list = response;
|
|
14
|
+
return list.value;
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { getDefaultDriveRef } from "../../services/drive.js";
|
|
3
|
+
import { driveItemPath, } from "../../services/driveItem.js";
|
|
4
|
+
import { generateTempFileName } from "../../services/temporaryFiles.js";
|
|
5
|
+
import { workbookRangeRef } from "../../services/workbookRange.js";
|
|
6
|
+
import deleteDriveItemWithRetry from "../../tasks/deleteDriveItemWithRetry.js";
|
|
7
|
+
import calculateWorkbook from "../workbook/calculateWorkbook.js";
|
|
8
|
+
import createWorkbook from "../workbook/createWorkbook.js";
|
|
9
|
+
import createWorkbookWorksheet from "../workbookWorksheet/createWorkbookWorksheet.js";
|
|
10
|
+
import createWorkbookTable from "./createWorkbookTable.js";
|
|
11
|
+
import listWorkbookTableColumns from "./listWorkbookTableColumns.js";
|
|
12
|
+
describe("listWorkbookTableColumns", () => {
|
|
13
|
+
it("can list columns in an existing table", { timeout: 10000 }, async () => {
|
|
14
|
+
const workbookName = generateTempFileName("xlsx");
|
|
15
|
+
const workbookPath = driveItemPath(workbookName);
|
|
16
|
+
const workbook = await createWorkbook(getDefaultDriveRef(), workbookPath);
|
|
17
|
+
try {
|
|
18
|
+
const worksheet = await createWorkbookWorksheet(workbook);
|
|
19
|
+
const rangeRef = workbookRangeRef(worksheet, "A1:D4");
|
|
20
|
+
const table = await createWorkbookTable(rangeRef, true);
|
|
21
|
+
await calculateWorkbook(workbook);
|
|
22
|
+
const columns = await listWorkbookTableColumns(table);
|
|
23
|
+
expect(columns.length).toBeGreaterThan(0);
|
|
24
|
+
}
|
|
25
|
+
finally {
|
|
26
|
+
await deleteDriveItemWithRetry(workbook);
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
});
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { operation } from "../../graphApi.js";
|
|
2
|
+
import { generatePath } from "../../services/templatedPaths.js";
|
|
3
|
+
/** Retrieve a list of rows in a table. @see https://learn.microsoft.com/en-us/graph/api/tablerow-list */
|
|
4
|
+
export default function listWorkbookTableRows(tableRef) {
|
|
5
|
+
return operation({
|
|
6
|
+
method: "GET",
|
|
7
|
+
path: generatePath("/sites/{site-id}/drives/{drive-id}/items/{item-id}/workbook/tables/{table-id}/rows", tableRef),
|
|
8
|
+
headers: {
|
|
9
|
+
"workbook-session-id": tableRef.sessionId,
|
|
10
|
+
},
|
|
11
|
+
body: null,
|
|
12
|
+
responseTransform: response => {
|
|
13
|
+
const list = response;
|
|
14
|
+
return list.value;
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { getDefaultDriveRef } from "../../services/drive.js";
|
|
3
|
+
import { driveItemPath, } from "../../services/driveItem.js";
|
|
4
|
+
import { generateTempFileName } from "../../services/temporaryFiles.js";
|
|
5
|
+
import { workbookRangeRef } from "../../services/workbookRange.js";
|
|
6
|
+
import deleteDriveItemWithRetry from "../../tasks/deleteDriveItemWithRetry.js";
|
|
7
|
+
import calculateWorkbook from "../workbook/calculateWorkbook.js";
|
|
8
|
+
import createWorkbook from "../workbook/createWorkbook.js";
|
|
9
|
+
import createWorkbookWorksheet from "../workbookWorksheet/createWorkbookWorksheet.js";
|
|
10
|
+
import createWorkbookTable from "./createWorkbookTable.js";
|
|
11
|
+
import listWorkbookTableRows from "./listWorkbookTableRows.js";
|
|
12
|
+
describe("listWorkbookTableRows", () => {
|
|
13
|
+
it("can list rows in an existing table", { timeout: 10000 }, async () => {
|
|
14
|
+
const workbookName = generateTempFileName("xlsx");
|
|
15
|
+
const workbookPath = driveItemPath(workbookName);
|
|
16
|
+
const workbook = await createWorkbook(getDefaultDriveRef(), workbookPath);
|
|
17
|
+
try {
|
|
18
|
+
const worksheet = await createWorkbookWorksheet(workbook);
|
|
19
|
+
const rangeRef = workbookRangeRef(worksheet, "A1:D4");
|
|
20
|
+
const table = await createWorkbookTable(rangeRef, true);
|
|
21
|
+
await calculateWorkbook(workbook);
|
|
22
|
+
const rows = await listWorkbookTableRows(table);
|
|
23
|
+
expect(rows.length).toBeGreaterThan(0);
|
|
24
|
+
}
|
|
25
|
+
finally {
|
|
26
|
+
await deleteDriveItemWithRetry(workbook);
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
});
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { operation } from "../../graphApi.js";
|
|
2
|
+
import { generatePath } from "../../services/templatedPaths.js";
|
|
3
|
+
import { workbookTableRef } from "../../services/workbookTable.js";
|
|
4
|
+
/** Retrieve a list of tables in a worksheet. @see https://learn.microsoft.com/en-us/graph/api/worksheet-list-tables */
|
|
5
|
+
export default function listWorkbookTables(worksheetRef) {
|
|
6
|
+
return operation({
|
|
7
|
+
method: "GET",
|
|
8
|
+
path: generatePath("/sites/{site-id}/drives/{drive-id}/items/{item-id}/workbook/worksheets/{worksheet-id}/tables", worksheetRef),
|
|
9
|
+
headers: {
|
|
10
|
+
"workbook-session-id": worksheetRef.sessionId,
|
|
11
|
+
},
|
|
12
|
+
body: null,
|
|
13
|
+
responseTransform: response => {
|
|
14
|
+
const list = response;
|
|
15
|
+
const tables = list.value.map(table => {
|
|
16
|
+
const tableRef = workbookTableRef(worksheetRef, table.id);
|
|
17
|
+
return {
|
|
18
|
+
...table,
|
|
19
|
+
...tableRef,
|
|
20
|
+
};
|
|
21
|
+
});
|
|
22
|
+
return tables;
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { getDefaultDriveRef } from "../../services/drive.js";
|
|
3
|
+
import { driveItemPath, } from "../../services/driveItem.js";
|
|
4
|
+
import { generateTempFileName } from "../../services/temporaryFiles.js";
|
|
5
|
+
import { workbookRangeRef } from "../../services/workbookRange.js";
|
|
6
|
+
import deleteDriveItemWithRetry from "../../tasks/deleteDriveItemWithRetry.js";
|
|
7
|
+
import calculateWorkbook from "../workbook/calculateWorkbook.js";
|
|
8
|
+
import createWorkbook from "../workbook/createWorkbook.js";
|
|
9
|
+
import createWorkbookWorksheet from "../workbookWorksheet/createWorkbookWorksheet.js";
|
|
10
|
+
import createWorkbookTable from "./createWorkbookTable.js";
|
|
11
|
+
import listTables from "./listWorkbookTables.js";
|
|
12
|
+
describe("listWorkbookTables", () => {
|
|
13
|
+
it("can list tables in an existing worksheet", { timeout: 10000 }, async () => {
|
|
14
|
+
const workbookName = generateTempFileName("xlsx");
|
|
15
|
+
const workbookPath = driveItemPath(workbookName);
|
|
16
|
+
const driveRef = getDefaultDriveRef();
|
|
17
|
+
const workbook = await createWorkbook(driveRef, workbookPath);
|
|
18
|
+
try {
|
|
19
|
+
const worksheet = await createWorkbookWorksheet(workbook);
|
|
20
|
+
const rangeRef = workbookRangeRef(worksheet, "A1:D4");
|
|
21
|
+
await createWorkbookTable(rangeRef, true);
|
|
22
|
+
await calculateWorkbook(workbook);
|
|
23
|
+
const tables = await listTables(worksheet);
|
|
24
|
+
expect(tables.length).toBeGreaterThan(0);
|
|
25
|
+
}
|
|
26
|
+
finally {
|
|
27
|
+
await deleteDriveItemWithRetry(workbook);
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
});
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { operation } from "../../graphApi.js";
|
|
2
|
+
import { generatePath } from "../../services/templatedPaths.js";
|
|
3
|
+
import { workbookWorksheetRef } from "../../services/workbookWorksheet.js";
|
|
4
|
+
/** Create a new worksheet, optionally with a defined name. @see https://learn.microsoft.com/en-us/graph/api/worksheetcollection-add */
|
|
5
|
+
export default function createWorkbookWorksheet(workbookRef, name) {
|
|
6
|
+
return operation({
|
|
7
|
+
method: "POST",
|
|
8
|
+
path: generatePath("/sites/{site-id}/drives/{drive-id}/items/{item-id}/workbook/worksheets/add", workbookRef),
|
|
9
|
+
headers: {
|
|
10
|
+
"workbook-session-id": workbookRef.sessionId,
|
|
11
|
+
"content-type": "application/json",
|
|
12
|
+
},
|
|
13
|
+
body: {
|
|
14
|
+
name
|
|
15
|
+
},
|
|
16
|
+
responseTransform: response => {
|
|
17
|
+
const worksheet = response;
|
|
18
|
+
const worksheetRef = workbookWorksheetRef(workbookRef, worksheet.id);
|
|
19
|
+
return {
|
|
20
|
+
...worksheet,
|
|
21
|
+
...worksheetRef
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
}
|