Google 脚本:“您的输入在单个单元格中包含的字符数超过了最多 50000 个字符”

问题描述 投票:0回答:3

您好,我试图提取电子邮件中的 PlainBody 内容,并即将完成提取电子邮件,直到有一天我遇到错误,提示您的输入在单个单元格中包含的字符数超过了最大 50000 个字符。

如何设置在 Google 应用程序脚本中提取的字符数限制以避免此错误。?

  function getEmailsRange() {

  //Change sheet3 to sheet you would like the data to be pasted
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Raw");
  sheet.getRange('A1:D15000').clearContent();
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  //maximum emails to be extracted 500
  //is:unread in:MANILA
  var threads = GmailApp.search("after:2017/5/5 before:2017/5/6 in:REPORT",0,500);
  var menuEntries = [ {name: "Load Emails", functionName: "getEmails"} ];
  spreadsheet.addMenu("Email Extract", menuEntries);
  var row = 1;
  for (var i = 0; i < 50000; i++) {
    var messages=threads[i].getMessages();
    for (var m=0; m < messages.length; m++) {   

      sheet.getRange(row,4).setValue(messages[m].getDate());
      sheet.getRange(row,2).setValue(messages[m].getPlainBody());
      sheet.getRange(row,1).setValue(messages[m].getSubject());
      sheet.getRange(row,3).setValue(messages[m].getFrom());
      row++; 

    }
  }
}
//var ss = SpreadsheetApp.getActiveSpreadsheet();


function Deleterow() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s = ss.getSheetByName('Processed'); // change to your own
  var values = s.getDataRange().getValues();

  for (var row in values)
    if (values[row][5] == 'DELETE')
      s.deleteRow(parseInt(row)+1);
};

google-apps-script google-sheets limits
3个回答
5
投票

问题是因为您将电子邮件正文设置为电子表格中的单元格,而单元格不能超过 50000 个字符。

您可以更改以下行:

sheet.getRange(row,2).setValue(messages[m].getPlainBody());

  sheet.getRange(row,2).setValue(messages[m].getPlainBody().substring(0, 50000));

这只会将前 50000 个字符添加到单元格中。其他选项是将电子邮件提取到多个单元格或将电子邮件提取到谷歌文档中。


3
投票

您可以通过使用 Sheet 类上的

appendRow
函数来解决此问题。

var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");

var data = "some really long string greater than 50k characters";
// write content to a new row created, no 50k error!
sheet.appendRow([data]);

var lastRowRange = sheet.getRange(sheet.getLastRow(), 1);

// copy newly created content to desired range
var outputRange = sheet.getRange("A1");
lastRowRange.copyTo(outputRange);

// clear newly created row
lastRowRange.clearContent();

0
投票

您可以使用一个技巧在 #GoogleSheets 单元格内存储数百万个 cahr。

  1. 将 2 个及更多文本部分放入单独的单元格中,在我的例子中为
    A2
    B2
  2. 使用此公式将这些文本部分与空格连接起来:
    =QUERY(TRANSPOSE(A2:B2),,9^99)

样本表

疯狂吧!

© www.soinside.com 2019 - 2024. All rights reserved.