【问题标题】:Is it possible to export table from Gmail body while preserving the format, to Google sheets using GAS?是否可以在保留格式的同时将表格从 Gmail 正文导出到使用 GAS 的 Google 表格?
【发布时间】:2023-01-11 15:42:35
【问题描述】:

我正在尝试使用 GAS 从 Gmail 正文中获取数据。具体来说,我收到一封包含表格内容的电子邮件;我正在尝试从 gmail 复制表格并将其写入 google 表格以供我进一步分析。以下是我收到的示例电子邮件:

我在 Google 表格中期望的输出:

更新:我可以通过参考Insert table from gmail to google spreadsheet by google script 对我的代码进行一些修改。

这是电子邮件正文和输出现在的样子。 电子邮件:

GSheet 输出:

表格中的合并单元格会出现此问题。该代码不会像它在 gmail 正文中显示的那样生成输出。有什么解决方法吗?

最终代码:

var SEARCH_QUERY = "SearchKey";

function getEmailss_(q) {
    var emails = [];
    var threads = GmailApp.search(q);
    if (threads.length == 0) {
      console.log("No threads found that match the search query: " + q);
    }
    for (var i in threads) {
        var msgs = threads[i].getMessages();
        for (var j in msgs) {
            var arrStr = msgs[j].getBody()
              .replace(/<\/tr>/gm, '[/tr]')
              .replace(/<\/td>/gm, '[/td]')
              .replace(/<.*?>/g, '\n')
              .replace(/^\s*\n/gm, '')
              .replace(/^\s*/gm, '')
              .replace(/\s*\n/gm, '\n')
              .split("[/tr]");
            if (arrStr.length == 1) {
              console.log("No data found in thread: " + threads[i].getFirstMessageSubject());
            }
            var line = [];

            for (var i = 0; i < arrStr.length - 1; i++) {

              line = arrStr[i].split("[/td]");
              line.length -= 1;
              emails.push(line);
            }
        }
    }
    if (emails.length == 0) {
      console.log("No emails found that match the search query: " + q);
    }
    return convert2ArrayToRectangular_(emails);
}

function convert2ArrayToRectangular_(array2d)
{
  // get max width
  var res = [];
  var w = 0;
  for (var i = 0; i < array2d.length; i++)
  {
    if (array2d[i].length > w) {w = array2d[i].length;}    
  }

  var row = [];
  for (var i = 0; i < array2d.length; i++)
  {
    row = array2d[i];
    if(array2d[i].length < w)
    {
      for (var ii = array2d[i].length; ii < w; ii++)
      {
        row.push('');        
      }  
    }
    res.push(row);
  }
  return res;
}


function appendData_(sheet, array2d) {
    var h = array2d.length;
    var l = array2d[0].length;
    sheet.getRange(1, 1, h, l).setValues(array2d);
 } 

function saveEmailsss() {
    var array2d = getEmailss_(SEARCH_QUERY);
    if (array2d) {
        appendData_(SpreadsheetApp.getActive().getSheetByName('Sheet1'), convert2ArrayToRectangular_(array2d));
    }
    markArchivedAsRead();
}

function markArchivedAsRead() {
    var threads = GmailApp.search('label:inbox is:unread to:me subject:importnumberlist');
    GmailApp.markThreadsRead(threads);
};

【问题讨论】:

  • 不清楚顶部图像和底部图像之间有什么区别。请用文字描述表格设计规范。
  • 请记住,Gmail 中的格式化邮件使用 HTML,而 Google 表格使用 SpreadsheetApp.Range 方法。
  • 第一张图片是来自 Gmail 的预览。这是我如何收到电子邮件的示例。第二个是我希望如何将 Gmail 中的表格以不同的列和行拉入谷歌表格。
  • 嗨 Lorena,已对我的问题进行了更改。是的,另一个问题在很大程度上有帮助;但现在遇到了一个新问题。请参考我更新的问题——如果你能指导在这方面可以做什么,那将非常有帮助

标签: google-apps-script google-sheets gmail html-email cell-formatting


【解决方案1】:

作为另一种方法,使用 Sheets API 怎么样?使用 Sheets API 时,可以通过包含合并的单元格来解析 HTML 表格。示例脚本如下。

示例脚本:

此脚本使用 Sheets API。 Please enable Sheets API at Advanced Google services

var SEARCH_QUERY = "SearchKey";

function getEmailss_(q, sheetName) {
  var emails = [];
  var threads = GmailApp.search(q);
  if (threads.length == 0) {
    console.log("No threads found that match the search query: " + q);
  }
  var tables = [];
  for (var i in threads) {
    var msgs = threads[i].getMessages();
    for (var j in msgs) {
      var arrStr = msgs[j].getBody();
      var table = arrStr.match(/<table[sSw]+?</table>/);
      if (table) {
        tables.push(table[0]);
      }
    }
  }
  if (emails.length == 0) {
    console.log("No emails found that match the search query: " + q);
  }
  if (tables.length == 0) {
    console.log("No tables.");
    return
  };
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName(sheetName);
  var requests = [{ pasteData: { html: true, data: tables.join(""), coordinate: { sheetId: sheet.getSheetId() } } }];
  Sheets.Spreadsheets.batchUpdate({ requests }, ss.getId());
}

function saveEmailsss() {
  var sheetName = "Sheet1"; // Please set your sheet name.
  getEmailss_(SEARCH_QUERY, sheetName);
  markArchivedAsRead();
}
  • 运行此脚本时,将检索电子邮件中包含的 HTML 表格并将其放入活动电子表格。

参考:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-10
    • 2023-02-17
    • 1970-01-01
    • 2019-03-14
    • 1970-01-01
    相关资源
    最近更新 更多