我的脚本直到最近才完美运行,但它已经抛出错误大约一周了。在这个库的帮助下更新项目以及获取有关项目的信息是完美的,但是在地图内创建项目给了我一个错误
这是我当前的代码:
/**
* Создает проекты Google Apps Script из исходного кода, представленного в виде блобов (бинарных объектов).
* Проекты создаются на основе данных, взятых из определенного листа.
*/
function создать_проекты_из_блоб_файлов__createProjectByBlob() {
// Получение строк с названиями файлов и исходным кодом из листа SheetProject.
// Исключение заголовков и пустых строк.
const rows = Utils.values(SheetProject).filter(row => row[0] && row[0] != 'fileName');
// Формирование массива объектов с информацией о файлах скрипта.
const scriptFilesInfo = rows.map(row => ({ name: row[0].toString(), code: row[1].toString() }));
// Перевод информации о файлах скрипта в объекты Blob.
const blobs = scriptFilesInfo.map(({ name, code }) =>
Utilities.newBlob(code, 'text/plain', name));
try {
// Получение имен проектов для создания из листа, исключение заголовков и пустых строк.
const data = Utils.values(SheetProject).filter(row => row[2] && row[2] !== 'projectName').map(row => row[2]);
// Создание проектов с использованием функции ProjectApp2.createProjectByBlob
// и данных о файлах скрипта.
const creations = data.map((projectName) => {
const projectCreationResult = ProjectApp2.createProjectByBlob(projectName, blobs);
console.log(projectCreationResult);
// Возвращаем объект с информацией о созданном проекте.
return {
url: `https://script.google.com/u/0/home/projects/${projectCreationResult.scriptId}/edit`,
name: projectCreationResult.name,
result: projectCreationResult
};
});
// Логирование результатов создания проектов.
console.log('Created projects:', JSON.stringify(creations, null, 2));
// Отображение результатов создания проектов пользователя.
show(creations.map(({ url, name }) => [url, name]));
} catch (error) {
// Логирование ошибок в случае их возникновения.
console.error('Error in createProjectByBlob function:', JSON.stringify({ error: error.toString() }, null, 2));
}
};
现在我收到此错误:
Error: {"error":{"code":404,"message":"Invalid ID","status":"NOT_FOUND","details":[{"@type":"type.googleapis.com/google.rpc.LocalizedMessage","locale":"en-US","message":"Invalid ID"}]}}
updateProject @ Code.gs:218
createProject @ Code.gs:192
ProjectApp2.createProjectByBlob @ Code.gs:106
createProjectByBlob @ Code.gs:30
(функция без названия) @ testing.gs:24
我尝试使用 forEach 而不是 map,但我仍然以相同的方式得到当前错误 但是,当我尝试运行测试脚本时,它起作用了:
function myFunction() {
var json = {
timeZone: "Asia/Tokyo",
dependencies: {
enabledAdvancedServices: [
{
userSymbol: "Drive",
serviceId: "drive",
version: "v2",
},
],
},
exceptionLogging: "STACKDRIVER",
oauthScopes: ["https://www.googleapis.com/auth/drive"],
};
const names = ['ghbdtn', 'gjrf', 'ljcdblfybz'];
var blob = Utilities.newBlob(Utils.stringify(json), 'text/plain', "appsscript.json");
var blobs = [blob, Utilities.newBlob('// тесты', 'text/plain', 'ntcn')];
var res = names.map(name => ProjectApp2.createProjectByBlob(name, blobs))
// var res = ProjectApp2.updateProjectByBlob(projectId, blob); // If this is used, the Manifests in the existing project is updated.
Logger.log(res);
}
scriptFilesInfo 示例:
[ { name: 'appsscript.json',
code: '{\n "timeZone": "Asia/Yekaterinburg",\n "dependencies": {\n "libraries": [\n {\n "userSymbol": "Trigger_lib",\n "libraryId": "1JqffuBy8rTgiUSudJYAbR8qokG-3MUSRClmyWRrY5S8",\n "version": 0,\n "developmentMode": true\n },\n {\n "userSymbol": "Tg_lib",\n "libraryId": "1UbzKANMiHPB7PImDQDEXmJygTlvlDVSRe-kUV68JgTE",\n "version": 0,\n "developmentMode": true\n }\n ]\n },\n "oauthScopes": [\n "https://www.googleapis.com/auth/script.external_request",\n "https://www.googleapis.com/auth/script.scriptapp",\n "https://www.googleapis.com/auth/drive",\n "https://www.googleapis.com/auth/drive.file",\n "https://www.googleapis.com/auth/drive.readonly",\n "https://www.googleapis.com/auth/spreadsheets",\n "https://www.googleapis.com/auth/spreadsheets.readonly",\n "https://mail.google.com/",\n "https://www.google.com/calendar/feeds",\n "https://www.google.com/m8/feeds",\n "https://www.googleapis.com/auth/admin.directory.group",\n "https://www.googleapis.com/auth/admin.directory.user",\n "https://www.googleapis.com/auth/documents",\n "https://www.googleapis.com/auth/drive",\n "https://www.googleapis.com/auth/forms.currentonly",\n "https://www.googleapis.com/auth/groups",\n "https://www.googleapis.com/auth/script.deployments",\n "https://www.googleapis.com/auth/script.deployments.readonly",\n "https://www.googleapis.com/auth/script.metrics",\n "https://www.googleapis.com/auth/script.processes",\n "https://www.googleapis.com/auth/script.projects",\n "https://www.googleapis.com/auth/script.projects.readonly",\n "https://www.googleapis.com/auth/spreadsheets",\n "https://www.googleapis.com/auth/userinfo.email"\n ],\n "exceptionLogging": "STACKDRIVER",\n "runtimeVersion": "V8"\n}' },
{ name: 'settings',
code: '/** \n* постоянные перменные\n*/\n\nconst ss = SpreadsheetApp.openbyUrl();\nconst ssID = ss.getId();\n\n// Получение доступа к свойствам скрипта\nconst properties = PropertiesService.getScriptProperties();\n\n/**\n* вспомогательные функции\n*/\n' } ]
我不清楚为什么测试功能有效而我的却不能。 你能告诉我哪里错了吗?
当我看到您提供的
scriptFilesInfo
值时,我认为libraryId
的值是无效值,如下所示。
"libraries": [
{
"userSymbol": "Trigger_lib",
"libraryId": "1JqffuBy8rTgiUSudJYAbR8qokG-3MUSRClmyWRrY5S8", // In the current stage, this is an invalid value.
"version": 0,
"developmentMode": true
},
{
"userSymbol": "Tg_lib",
"libraryId": "1UbzKANMiHPB7PImDQDEXmJygTlvlDVSRe-kUV68JgTE", // In the current stage, this is an invalid value.
"version": 0,
"developmentMode": true
}
]
你的库ID的长度是44,我猜测这个库ID可能是旧的ID。
在当前阶段,库 ID 与 Google Apps 脚本项目的文件 ID 相同。那么,这样的话,ID的长度就是57。我猜测当前的问题
Error: {"error":{"code":404,"message":"Invalid ID","status":"NOT_FOUND","details":[{"@type":"type.googleapis.com/google.rpc.LocalizedMessage","locale":"en-US","message":"Invalid ID"}]}}
的原因就是这个原因。
不幸的是,我不知道您正在使用的库的有效库 ID。因此,在这个答案中,我想提出一个修改后的脚本来消除错误
"message":"Invalid ID"
。为了消除这个错误,请进行如下修改。
const scriptFilesInfo = rows.map(row => ({ name: row[0].toString(), code: row[1].toString() }));
const orgScriptFilesInfo = rows.map(row => ({ name: row[0].toString(), code: row[1].toString() }));
const scriptFilesInfo = orgScriptFilesInfo.map(({ name, code }) => {
if (name == "appsscript.json") {
const obj = JSON.parse(code);
obj.dependencies.libraries = obj.dependencies.libraries.filter(({ libraryId }) => libraryId.length > 44);
// or delete obj.dependencies.libraries;
code = JSON.stringify(obj);
}
return { name, code };
});
scriptFilesInfo
修改为orgScriptFilesInfo
的const scriptFilesInfo = rows.map(row => ({ name: row[0].toString(), code: row[1].toString() }));
。scriptFilesInfo
。delete obj.dependencies.libraries;
而不是 obj.dependencies.libraries = obj.dependencies.libraries.filter(({ libraryId }) => libraryId.length > 44);
。scriptFilesInfo
值反映我的修改来测试您的显示脚本时,我确认该脚本可以正常工作。Trigger_lib
和Tg_lib
的有效库ID,当你使用它们时,我认为你当前的脚本是有效的。