【问题标题】:Fusion tables importRows via Apps Script Failing more than notFusion 表 importRows 通过 Apps 脚本失败不止
【发布时间】:2014-09-30 01:21:09
【问题描述】:

我正在尝试从 GMail 帐户中提取 csv 附件并将它们推送到 Fusion 表中。它有时可以工作,但大多数时候它会失败并显示错误“执行失败:处理导入时出现内部错误。请重试。”来自 Fusion 表的 importRows 调用。导入的大小约为 4k,远低于 1m 的限制。

我将尝试使用 Fusion table SQL INSERT 选项而不是 importRows,但只是想看看我是否可能在 importRows 调用中做错了。我什至在调用之间设置了 5 秒的延迟,以查看是否需要更慢地馈送 Fusion 表。

这是应用脚本:

function getDataFromMailbox() {
  var tableID = "XXXXXXXX"; 
  var threads = GmailApp.getInboxThreads();
  if (threads.length) {
    var thread = threads.pop();
    var messages = thread.getMessages();
    for (var j=0; j < messages.length; j++) {
      var message = messages[j];
      if ( message.isUnread() ) {
        var from = message.getFrom();
        if (from == "xxxxxx@gmail.com") {
          var attachments = message.getAttachments();
          for (var k=0; k< attachments.length; k++) {
            var attachment = attachments[k];
            Logger.log( attachment.getSize() );
            FusionTables.Table.importRows(tableID, attachment, {startLine:2});
          }
        } else {
          thread.moveToTrash(); // Thread isn't from our source
        }
        message.markRead();
      }
    }
    Logger.log("Processed %s messages", messages.length);
    if ( !thread.isUnread() ) { thread.moveToArchive(); }
  }
}

【问题讨论】:

    标签: google-apps-script google-fusion-tables


    【解决方案1】:

    我终于有机会再次研究这个问题。看起来睡眠呼叫是关键。如果在融合表导入后我有 5 秒的睡眠,我会收到导入错误。如果我让脚本休眠 10 秒,我会收到超时错误。 7 秒似乎刚刚好(至少今天是这样)。这是我更新的脚本,以防有人想将数据记录到 gmail 帐户,然后使用 App 脚本将其拉到 Fusion 表中。

    function getDataFromMailbox() {
      var tableID = "XXXXXXXXXXXXXXXXXX";
    
      var threads = GmailApp.getInboxThreads();
      while (threads.length) {
        var thread = threads.pop();
        var messages = thread.getMessages();
        for (var j=0; j < messages.length; j++) {
          var message = messages[j];
          if ( message.isUnread() ) {
            var from = message.getFrom();
            if (from == "XXXXXXXXX@gmail.com") {
              var attachments = message.getAttachments();
              for (var k=0; k< attachments.length; k++) {
                var attachment = attachments[k];
    
                var attString = attachment.getDataAsString();
                var lines = attString.match(/^.*((\r\n|\n|\r)|$)/gm);
                lines.shift(); lines.shift();
    
                Logger.log( lines.length );
                FusionTables.Table.importRows(tableID, attachment, {startLine:2});
              }
            } else {
              thread.moveToTrash(); // Thread isn't from our source
            }
            Logger.log( "Processed message: " + message.getId() );
            message.markRead();
            Utilities.sleep(7000);  // Wait for fusion tables to catch up
          }
        }
        Logger.log("Processed %s messages", messages.length);
        if ( !thread.isUnread() ) { thread.moveToArchive(); }
      }
    }
    

    【讨论】:

    • 即使我使用指数退避 (gist.github.com/peterherrmann/2700284),我也会得到同样的结果,但即使在 20 秒延迟后,我仍然在第二次调用 importRows 时遇到错误。
    猜你喜欢
    • 2014-10-11
    • 2017-10-02
    • 1970-01-01
    • 1970-01-01
    • 2017-08-15
    • 1970-01-01
    • 1970-01-01
    • 2014-10-16
    • 2013-02-06
    相关资源
    最近更新 更多