错误:使用 tanaike 的 ProjectApp2 库在地图中创建项目时 ID 无效

问题描述 投票:0回答:1

我的脚本直到最近才完美运行,但它已经抛出错误大约一周了。在这个库的帮助下更新项目以及获取有关项目的信息是完美的,但是在地图内创建项目给了我一个错误

这是我当前的代码:

/**
 * Создает проекты 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' } ]

我不清楚为什么测试功能有效而我的却不能。 你能告诉我哪里错了吗?

google-apps-script http-status-code-404
1个回答
0
投票

修改要点:

当我看到您提供的

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() }));
  • 我添加了一个脚本,用于通过删除旧的库 ID 来创建新的
    scriptFilesInfo
  • 如果您想删除全部,请使用
    delete obj.dependencies.libraries;
    而不是
    obj.dependencies.libraries = obj.dependencies.libraries.filter(({ libraryId }) => libraryId.length > 44);
  • 当我通过使用您提供的
    scriptFilesInfo
    值反映我的修改来测试您的显示脚本时,我确认该脚本可以正常工作。

注:

  • 当然,如果你已经知道
    Trigger_lib
    Tg_lib
    的有效库ID,当你使用它们时,我认为你当前的脚本是有效的。
© www.soinside.com 2019 - 2024. All rights reserved.