我将我的第一个Google Apps脚本放在一起,以便将电子邮件写入电子表格。它工作正常,除了我想用来缩短消息体的子字符串方法。脚本引擎返回“无法从null [...]调用子字符串”。我找到了这个帖子(google apps script TypeError: Cannot call method "substring" of undefined),但解决方案没有帮助 - 或者我不明白它的可能性很大。
这是我的剧本。
function labelToSpreadsheet() {
var threads = GmailApp.getUserLabelByName('newaddress').getThreads();
var spreadsheet = SpreadsheetApp.openById("onehellofanID")
var sheet = spreadsheet.getSheets()[0];
Logger.log (spreadsheet.getName());
for (var i = 0; i < threads.length; i++) {
var messages = threads[i].getMessages();
for (var j = 0; j < messages.length; j++) {
var shortendContent = messages[j].getPlainBody().substring(0, 500);
sheet.appendRow([messages[j].getSubject(), messages[j].getFrom(), messages[j].getReplyTo(), messages[j].getDate(), shortendContent]);
}
}
};
答案 0 :(得分:1)
这让我疯了,因为你的代码没有理由不起作用,我也得到同样的错误。我把它缩小到'getPlainBody()'返回'null',但是无法弄清楚为什么即使I used GMails own example也是如此。
当我意识到发生的事情是某些消息 在身体中没有返回任何内容时,我几乎将它称为一个错误。具体来说,有些公司会发送完全不是文本内容的新闻通讯,但实际上是图像,其中包含内容(我的测试标签中的第一条消息就是这种情况,因此我疯了)。
所以,这里的问题是你正在运行它的标签有一些消息,其内容只一个图像,没有任何文本(或者可能,只是完全空白),因此'getPlainBody()'返回'那里什么都没有'(Null),你不能得到任何东西的子串。
一个简单的'if'语句实际上很好地处理了这个错误,因为你可以告诉脚本写入表单'此消息的内容是一个图像'(或者你想要的任何内容)。
这个稍微修改过的代码版本适用于我:
function labelToSpreadsheet() {
var threads = GmailApp.getUserLabelByName(LABELNAME).getThreads();
var spreadsheet = SpreadsheetApp.openById(SHEETID);
var sheet = spreadsheet.getSheets()[0];
for (var i = 0; i < threads.length; i++) {
var messages = threads[i].getMessages();
for (var j = 0; j < messages.length; j++) {
if(messages[j].getPlainBody() == null){
var shortendContent = 'This message was an image';
}else{
var shortendContent = messages[j].getPlainBody().substring(0, 500);
};
sheet.appendRow([messages[j].getSubject(), messages[j].getFrom(), messages[j].getReplyTo(), messages[j].getDate(), shortendContent]);
}
}
};
我为这个给自己一个金星,想弄清楚这很烦人。