【问题标题】:I'm having trouble grabbing a XML attachment and saving it to a Google drive folder我无法获取 XML 附件并将其保存到 Google 驱动器文件夹
【发布时间】:2021-03-03 22:10:07
【问题描述】:

当我在网上查找时,我发现了一个我一直用作参考的脚本。我无法获取 copyBlob 命令来获取我需要的 XML 数据。我需要的只是将此附件保存到特定的驱动器文件夹中。我不断收到类型错误文件夹。CreateFiles 不是函数。我想我的措辞也可能是错误的,因为我相信它会在我的驱动器中创建一个文件夹,我只是希望它把它保存到一个特定的文件夹中。我只是想将这些材料保存在以后易于参考的形式中,这就是我使用 copyBlob 的原因。我错过了什么吗?我不认为将附件保存到文件夹会这么棘手。



function saveAttachmentInFolder(){
  var folder = DriveApp.getFolderById('1QTrx6_XXycHs8Wa3fiwEeXjN0qyWGypo');
  var userId = "abc123.@xxxx.com";
  var query = "label:ToBeProcessedByGAS";
  var res = Gmail.Users.Messages.list(userId, {q: query});
  Logger.log(res);
  if(res.resultSizeEstimate >0){
    res.messages.forEach(function(m){
       var attA=GmailApp.getMessageById(m.id).getAttachments();
      Logger.log(attA)
      attA.forEach(function(a){
        var ts=Utilities.formatDate(new Date(),Session.getScriptTimeZone(), "yyMMddHHmmss");
        folder.createFiles(blob()).setName(a.getName()+ts);
     });
    });
  }
};


【问题讨论】:

    标签: xml google-apps-script gmail saving-data


    【解决方案1】:

    您当前的代码中有 2 个问题:

    1. 您使用了DriveApp.getFoldersByName(name),它将返回一个FolderIterator,它是用户驱动器中具有给定名称的所有文件夹的集合,它在某种程度上是具有给定名称的文件夹数组。

    解决方案:

    如果您已有要保存附件的特定文件夹,请改用DriveApp.getFolderById(id)。您只需要提供您可以在文件夹的 url 链接中获得的文件夹 id。

    示例驱动器文件夹 URL:

    https://drive.google.com/corp/drive/folders/1lFzVvlBnBi-2o1VQGF5JDFxxxxxxx?resourcekey=0-ovPPl55Wxxxxxxx
    

    文件夹 id 将是“文件夹/”之后和“?”之前的文本https://drive.google.com/corp/drive/folders/<Folder Id>?resourcekey=0-ovPPl55Wxxxxxxx

    1. Class Folder 和 Class FolderIterator 都没有 createFiles() 方法。应该是Folder.createFile(blob)

    示例代码:

    function saveAttachmentInFolder(){
      var folder = DriveApp.getFolderById('1QHe2zCebXBZxiplAfVZpOxxxxxx');
      var userId = "abc123@xxxxx.com";
      var query = "label:ToBeProcessedByGAS";
      var res = Gmail.Users.Messages.list(userId, {q: query});
      Logger.log(res);
    
      if(res.resultSizeEstimate >0){
        res.messages.forEach(function(m){
          var attA=GmailApp.getMessageById(m.id).getAttachments();
          Logger.log(attA);
          attA.forEach(function(a){
            var ts=Utilities.formatDate(new Date(),Session.getScriptTimeZone(), "yyMMddHHmmss");
            folder.createFile(a.copyBlob()).setName(a.getName()+ts);
          });
        });
      }
    };
    

    输出:

    【讨论】:

    • 你能更新你的最新代码以便我进一步检查吗?
    • 这太棒了,谢谢!这两个部分终于起作用了,但现在它说无法读取未定义的“forEach”。我以为我在 res.message.forEach(function(m) 中由 (m) 定义了它?这是什么意思?是的,我可以
    • 是的,请更新最新代码并在执行日志中包含完整的错误
    • 我更新了它,错误代码正是 TypeError: Cannot read property 'forEach' of undefined saveAttachmentInFolder
    • 当您的Gmail.Users.Messages.list() 请求返回一个空的搜索结果时会出现您遇到的错误,响应正文中的messages 参数将不存在。因此不会有这样的res.messages 数组。您可以通过在日志中显示您的res 变量来验证这一点。您可以在检查消息参数之前检查是否为res.resultSizeEstimate >0 。查看答案中更新的示例代码
    猜你喜欢
    • 2015-06-10
    • 1970-01-01
    • 2020-02-18
    • 1970-01-01
    • 2021-01-13
    • 1970-01-01
    • 2021-03-18
    • 2019-10-16
    • 2013-03-25
    相关资源
    最近更新 更多