【问题标题】:Google script replaceAllShapesWithImage with image from drive doesn"t work any moreGoogle 脚本 replaceAllShapesWithImage 与驱动器中的图像不再起作用
【发布时间】:2020-02-05 13:26:40
【问题描述】:

从昨天开始,我的一个谷歌脚本不再工作了。 脚本

  1. 在驱动器上拍照
  2. 复制幻灯片
  3. 用图片替换形状

但是我收到了这个错误:

“提供的图片格式不受支持。”

-> 我授予对图像的所有访问权限:它不会改变任何东西

-> 如果我在驱动器之外使用 url,脚本就可以工作

任何想法

function test_image(){
  var imageUrls = DriveApp.getFilesByName("DSC_3632.png");
  var file = "undefined";
  while ( imageUrls.hasNext()) {
    var file = imageUrls.next();
  }

  var imageUrl = file.getDownloadUrl() + "&access_token=" + ScriptApp.getOAuthToken();

  var model_file = DriveApp.getFileById("your-id");
  var presentation = model_file.makeCopy("totot");
  var presentation =Slides.Presentations.get(presentation.getId())

  var requests = [{
      "replaceAllShapesWithImage":
        {
          "imageUrl": imageUrl,
          "imageReplaceMethod": "CENTER_INSIDE",
          "containsText": {
            "text": "toto",
            "matchCase": false,
          }
        }
    }];


  var presentationId = presentation.presentationId

  var createSlideResponse = Slides.Presentations.batchUpdate({
    requests: requests
  }, presentationId);


}

【问题讨论】:

    标签: google-apps-script google-drive-api google-slides-api google-slides


    【解决方案1】:

    这个答案怎么样?请认为这只是几个可能的答案之一。

    问题和解决方法:

    我认为您的问题的原因是由于official document的以下修改。

    首先,我们将对 Google Drive API 的授权进行更改。如果您使用查询参数中的访问令牌授权对 Drive API 的下载请求,则需要迁移您的请求以使用 HTTP 标头进行身份验证。从 2020 年 1 月 1 日开始,将不再支持对使用查询参数中的访问令牌进行身份验证的 files.get、revisions.get 和 files.export 端点的下载调用,这意味着您需要更新您的身份验证方法。

    由于上述情况,var imageUrl = file.getDownloadUrl() + "&access_token=" + ScriptApp.getOAuthToken(); 的 URL 无法使用。例如,当它访问 URL 时,即使使用访问令牌,也会显示登录屏幕。

    为了避免这个问题,下面的修改如何?

    修改点:

    • 该文件公开共享并放到 Google 幻灯片中。然后,关闭共享文件。
      • 在这种情况下,即使关闭文件共享,幻灯片上的放置图像也不会被删除。
    • webContentLink 用作 URL。
      • 就像https://drive.google.com/uc?export=download&id=###

    修改脚本:

    当你的脚本被修改后,变成如下。

    function test_image(){
      var imageUrls = DriveApp.getFilesByName("DSC_3632.png");
      var file; // Modified
      while (imageUrls.hasNext()) {
        file = imageUrls.next();
      }
      file.setSharing(DriveApp.Access.ANYONE_WITH_LINK, DriveApp.Permission.VIEW); // Added
      var imageUrl = "https://drive.google.com/uc?export=download&id=" + file.getId(); // Modified
      var model_file = DriveApp.getFileById("your-id");
      var presentation = model_file.makeCopy("totot");
      var presentation =Slides.Presentations.get(presentation.getId())
      var requests = [{
        "replaceAllShapesWithImage": {
          "imageUrl": imageUrl,
          "imageReplaceMethod": "CENTER_INSIDE",
          "containsText": {
            "text": "toto",
            "matchCase": false,
          }
        }
      }];
      var presentationId = presentation.presentationId
      var createSlideResponse = Slides.Presentations.batchUpdate({requests: requests}, presentationId);
      file.setSharing(DriveApp.Access.PRIVATE, DriveApp.Permission.NONE); // Added
    }
    

    参考资料:

    如果我误解了您的问题并且这不是您想要的方向,我深表歉意。

    【讨论】:

    • 很好奇。为什么不发送{'Authorization': 'Bearer '+ token}。它说 http 标头工作正常吗?
    • @TheMaster 感谢您的评论。在 OP 的脚本中,使用 Slides API 将文本替换为图像。为此,我修改了 OP 的脚本。在这种情况下,图像必须是 URL。并且,该 URL 需要能够从外部访问。因此,请求标头不用于 Slides API 的请求正文。这样,在我的修改中,文件被公开共享一次并替换为图像并关闭共享。当然,在使用 Slides 服务时,可以直接使用 blob。如果我误解了您的评论,我深表歉意。
    • @TheMaster 感谢您的回复。作为另一种方法,当使用 Google Document 时,可以将 Document 中的图像检索为像 Google Photo 一样的时间 URL。虽然是临时的,但是这些 URL 是公开的,所以这也可以用于 OP 的情况。
    • 我遇到了这个问题并尝试使用 blob base64string,但我收到了一个不同的错误,抱怨 url 属性超出了字符串长度。终于解决了文件权限变通办法。
    猜你喜欢
    • 2015-02-24
    • 1970-01-01
    • 2021-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-08
    相关资源
    最近更新 更多