如何通过 Google 脚本 API (Node.js) 添加库?
How to add libraries via Google Script API (Node.js)?
我正在开发一个应用程序,可以自动创建 google 具有容器绑定脚本的电子表格。为了方便脚本的维护,脚本没有业务逻辑,而是有委托代码,如下所示。
container-bound script
const onOpen = (e) => {
lib.onOpen(e)
}
为此,我想将具有实际业务逻辑的库“添加”到容器绑定脚本项目。我知道如何手动实现,但我也想使用 Google Script API SDK for Node.js 来自动化它。我试图找到一种方法,但似乎 SDK 不支持以编程方式将库添加到脚本项目。
有人有解决方案吗?
谢谢,
既然如此,我认为您可以通过修改清单文件来添加库 (appsscript.json
)。安装库的示例appsscript.json
如下。而且,Google Apps 脚本 API 可以编辑 appsscript.json
。
样本appsscript.json
:
{
"timeZone": "Asia/Tokyo",
"exceptionLogging": "STACKDRIVER",
"runtimeVersion": "V8",
"dependencies": {
"libraries": [ // <--- Here, you can install the library.
{
"userSymbol": "lib",
"version": "0",
"libraryId": "### ID of library ###",
"developmentMode": true
}
]
}
}
示例脚本:
当上面的解释反映在Node.js的示例脚本中时,它变成如下。在这种情况下,使用 Node.js 的 googleapis。
const scriptId = "###"; // Please set the script ID of the Google Apps Script project.
const lib = {
userSymbol: "lib",
version: "0",
libraryId: "### ID of library ###",
developmentMode: true,
};
const script = google.script({ version: "v1", auth }); // Please use your "auth" in your script.
// 1. Retrieve the existing scripts from Google Apps Script project.
const res1 = await script.projects.getContent({ scriptId: scriptId }).catch((err) => console.log(err.errors));
if (!res1) return;
// 2. Modify `appsscript.json` file.
const files = res1.data.files.map((e) => {
if (e.name == "appsscript") {
const obj = JSON.parse(e.source);
if (
obj.dependencies.libraries &&
!obj.dependencies.libraries.some(
({ libraryId }) => libraryId == lib.libraryId
)
) {
obj.dependencies.libraries.push(lib);
} else {
obj.dependencies.libraries = [lib];
}
e.source = JSON.stringify(obj, null, " ");
}
return e;
});
// 3. Update Google Apps Script project with the modified `appsscript.json` file.
const res2 = await script.projects
.updateContent({ scriptId: scriptId, resource: { files: files } })
.catch((err) => console.log(err.errors));
if (!res2) return;
console.log("Done.");
注:
- 在此答案中,假设您已经能够使用 Google Apps Script API 和 Node.js 获取和放置 Google Apps Script 项目的值.请注意这一点。
参考文献:
我正在开发一个应用程序,可以自动创建 google 具有容器绑定脚本的电子表格。为了方便脚本的维护,脚本没有业务逻辑,而是有委托代码,如下所示。
container-bound script
const onOpen = (e) => {
lib.onOpen(e)
}
为此,我想将具有实际业务逻辑的库“添加”到容器绑定脚本项目。我知道如何手动实现,但我也想使用 Google Script API SDK for Node.js 来自动化它。我试图找到一种方法,但似乎 SDK 不支持以编程方式将库添加到脚本项目。
有人有解决方案吗?
谢谢,
既然如此,我认为您可以通过修改清单文件来添加库 (appsscript.json
)。安装库的示例appsscript.json
如下。而且,Google Apps 脚本 API 可以编辑 appsscript.json
。
样本appsscript.json
:
{
"timeZone": "Asia/Tokyo",
"exceptionLogging": "STACKDRIVER",
"runtimeVersion": "V8",
"dependencies": {
"libraries": [ // <--- Here, you can install the library.
{
"userSymbol": "lib",
"version": "0",
"libraryId": "### ID of library ###",
"developmentMode": true
}
]
}
}
示例脚本:
当上面的解释反映在Node.js的示例脚本中时,它变成如下。在这种情况下,使用 Node.js 的 googleapis。
const scriptId = "###"; // Please set the script ID of the Google Apps Script project.
const lib = {
userSymbol: "lib",
version: "0",
libraryId: "### ID of library ###",
developmentMode: true,
};
const script = google.script({ version: "v1", auth }); // Please use your "auth" in your script.
// 1. Retrieve the existing scripts from Google Apps Script project.
const res1 = await script.projects.getContent({ scriptId: scriptId }).catch((err) => console.log(err.errors));
if (!res1) return;
// 2. Modify `appsscript.json` file.
const files = res1.data.files.map((e) => {
if (e.name == "appsscript") {
const obj = JSON.parse(e.source);
if (
obj.dependencies.libraries &&
!obj.dependencies.libraries.some(
({ libraryId }) => libraryId == lib.libraryId
)
) {
obj.dependencies.libraries.push(lib);
} else {
obj.dependencies.libraries = [lib];
}
e.source = JSON.stringify(obj, null, " ");
}
return e;
});
// 3. Update Google Apps Script project with the modified `appsscript.json` file.
const res2 = await script.projects
.updateContent({ scriptId: scriptId, resource: { files: files } })
.catch((err) => console.log(err.errors));
if (!res2) return;
console.log("Done.");
注:
- 在此答案中,假设您已经能够使用 Google Apps Script API 和 Node.js 获取和放置 Google Apps Script 项目的值.请注意这一点。