上传.xls文件并通过GAS转换为Google电子表格时出错

时间:2013-05-28 08:13:25

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

之前的研究

请不要将此问题作为副本关闭,因为我的问题涉及如何解决我收到的具体错误消息,而不是我的目标是否可实现的一般性问题 - 正如我提出的一些其他相关问题研究及以下详细介绍,已经问过。

相关问题及其不适用的原因

    2012年7月27日提出的
  1. This问题不适用,因为:(1)太旧(10个月后,可能存在新的解决方案/方法)和(2)不处理我遇到的特定错误消息。
  2. This提问,于2012年12月12日提出申请,未能申请类似原因。
  3. 我的下面的代码是从here复制而来的here。这些可能是工作解决方案,因为它们已经在Stack Overflow上的其他问题/答案交换中被引用。
  4. 目的

    以编程方式,我正在尝试:

    1. 搜索我的电子邮件收件箱。
    2. 查找Excel(.xls)文件附件。
    3. 将这些.xls文件附件上传到Google云端硬盘。
    4. 上传时,将.xls文件转换为Google电子表格文件格式。
    5. 问题

      当我执行processInbox()(此问题底部显示的代码)时,它失败了,我收到如下所示的错误消息。

      错误消息

      Request failed for returned code 403.
      Server response:
      {
         "error":{
            "errors":[
               {
                  "domain":"usageLimits",
                  "reason":"accessNotConfigured",
                  "message":"AccessNotConfigured"
               }
            ],
            "code":403,
            "message":"AccessNotConfigured"
         }
      }
      (line 13, file "DriveUpload")
      

      问题

      我做错了什么?我该如何解决呢?
      例如,相对于设置我的项目,比如访问Google云端硬盘或其他内容,我是否需要在我的API console中执行一些特殊操作?我错过了什么?

      注意:我还没有在我的任何应用程序中成功实现oAuth。

      错误来源

      第13行

      (这是错误消息引用的代码行。)

      var uploadRequest = UrlFetchApp.fetch("https://www.googleapis.com/upload/drive/v2/files/?uploadType=media&convert=true&key="+key, params); // convert=true convert xls to google spreadsheet
      

      代码

      我正在使用的完整代码体现在下面供您参考。我提取了错误触发,“第13行”,并在上面突出显示它,以帮助我们专注于问题的近因。

      DriveUpload.js

      function uploadXls(file) {
        authorize();
        var key = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; // <-- developer key
        var metadata = { title: file.getName() }
        var params = {method:"post",
                      oAuthServiceName: "drive",
                      oAuthUseToken: "always",
                      contentType: "application/vnd.ms-excel",
                      contentLength: file.getBytes().length,
                      payload: file.getBytes()
                     };
        // convert=true convert xls to google spreadsheet
        var uploadRequest = UrlFetchApp.fetch("https://www.googleapis.com/upload/drive/v2/files/?uploadType=media&convert=true&key="+key, params);
        var uploadResponse = Utilities.jsonParse(uploadRequest.getContentText());
        var params = {method:"put",
                      oAuthServiceName: "drive",
                      oAuthUseToken: "always",
                      contentType: "application/json",
                      payload: Utilities.jsonStringify(metadata)
                     };
        var metaRequest = UrlFetchApp.fetch("https://www.googleapis.com/drive/v2/files/"+uploadResponse.id+"?key="+key, params)
        return DocsList.getFileById(uploadResponse.id);
      }
      
      function authorize() {
        var oauthConfig = UrlFetchApp.addOAuthService("drive");
        var scope = "https://www.googleapis.com/auth/drive";
        oauthConfig.setConsumerKey("anonymous");
        oauthConfig.setConsumerSecret("anonymous");
        oauthConfig.setRequestTokenUrl("https://www.google.com/accounts/OAuthGetRequestToken?scope="+scope);
        oauthConfig.setAuthorizationUrl("https://accounts.google.com/OAuthAuthorizeToken");    
        oauthConfig.setAccessTokenUrl("https://www.google.com/accounts/OAuthGetAccessToken");  
      }
      
      function processInbox() {
        // get all threads in inbox
        var threads = GmailApp.getInboxThreads();
        for (var i = 0; i < threads.length; i++) {
          // get all messages in a given thread
          var messages = threads[i].getMessages();
          // iterate over each message
          for (var j = 0; j < messages.length; j++) {
            // log message subject
            var subject = messages[j].getSubject()
            //Logger.log(subject);
            if ( subject == "with xls attach" ){
              Logger.log(messages[j].getSubject());
              var attach = messages[j].getAttachments()[0];
              var name = attach.getName();
              var type = attach.getContentType();
              //var data = attach.getDataAsString();
              Logger.log( name + " " + type + " " );
              var file = uploadXls(attach);
              SpreadsheetApp.open(file);
            }
          }
        }
      };
      

2 个答案:

答案 0 :(得分:1)

Drive API已内置于GAS中:https://developers.google.com/apps-script/reference/drive/

使用DriveApp,您的问题就会消失;-)

答案 1 :(得分:0)

这可能是临时解决方案

第1步:使用Google表单将数据收集到Google电子表格

第2步:将Zoho Sheet应用程序添加到您的Google云端硬盘

在Zoho Sheet中 去 数据菜单   »链接外部数据 选择其中一个 CSV RSS / Atom Feed 或HTML页面

您可以安排它按特定时间间隔进行更新

我喜欢的是Zoho的VBA和Macros 你也可以做数据透视表和表格

您可以将Excel VBA复制并粘贴到Zoho中! 我有一个Unpivot VBA,我将在我的Tabular数据集上运行 在我做一个PivotChart之前

很难击败Excel的所有功能,我常常依赖熟悉的工具! 如果我听到任何消息我将发布

祝你好运