在范围D2:D20中,我在电子邮件中搜索文本字符串。生成的电子邮件中的线程数显示在E列中。
EDIT
我正在尝试创建一个数组,该数组将对范围H2:?使用setvalues
?20(最后一列是可变的(。列H将是变量finding
的值,列I将显示第一封电子邮件str
。J列为第二条消息,K列为第三条消息,依此类推。
我想要做到这一点,我需要一个2D阵列,它将是
[[[finding],[str],[str],[str]],[[finding],[str]],[[finding],[str],[str],[str],...]]
不过,我可能错了这个假设。
我一直在将电子邮件str
转换为具有Strarr
的数组。然后我一直在把这个(我想(添加到ColHarr
中。
我收到错误:
异常:数据中的列数与范围中的列数目不匹配。数据为0,但范围为1。在findemail2(电话:52:43(
我确信我把阵列搞得一团糟。我甚至不确定2D阵列是否是我所需要的。有人能告诉我哪里出了问题吗?
function findemail() {
// For each row, show the messages for the email address (across columns)
var wkbk = SpreadsheetApp.getActive();
var sht = wkbk.getActiveSheet();
var allemails = sht.getRange('D2:D20'); //'+sht.getLastRow());
var emailVal = allemails.getValues();
var str = "";
var ColEarr = [];
var ColHarr = [[]];
var Strarr = [];
var strstr = "";
for (var b = 0; b < emailVal.length; b++) { // for each email in list, search
var finding = emailVal[b];
var eml = GmailApp.search('"'+finding+'"');
for (var n = 0; n < eml.length; n++) { // for each thread found
var thds = eml[n];
var AllMsgs = thds.getMessages();
for (var m = 0; m < AllMsgs.length; m++) { // for each message, get text
var msg = AllMsgs[m];
var body = msg.getPlainBody();
var hdr = msg.getDate() + "/n" + msg.getTo() + ' ##CC ' + msg.getCc() + ' ##BCC ' + msg.getBcc() + ' ##From ' + msg.getFrom() + ' ##Subject ' + msg.getSubject();
str = hdr + "/n" + body;
if (str !== "") {
var found = str.includes(finding); // check if email found in string
}
Strarr = finding;
ColHarr.push(Strarr);
if (found) {
if (str.length < 50000) {
Strarr = ([str]);
ColHarr = ColHarr.concat([Strarr]); // message to display
} else {
Strarr = ([str.slice(0,49999)]);
ColHarr = ColHarr.concat([Strarr]); // restrict message size if over 50k characters
}
} else {
Strarr = ([found]);
ColHarr = ColHarr.concat([Strarr]); // if no match in message, show false
}
}
}
ColEarr.push([eml.length]);
Logger.log(b);
str = "";
}
// setvalues E + H...
sht.getRange('E2:E'+(ColEarr.length+1)).setValues(ColEarr);
sht.getRange('H2:H'+(ColHarr.length+1)).setValues(ColHarr);
}
我需要一个2D数组(我想(,但我做错了var ColHarr = [[]];
应该是1D阵列var ColHarr = [];
在For循环开始时,我应该将搜索值添加到Strarr
中,因为我只需要它一次。
var eml = GmailApp.search('"'+finding+'"');
Strarr.push(finding);
当然,我不应该给数组元素分配=
,而应该推送它们。
if (found) {
if (str.length < 50000) { // message to display
Strarr.push([str]);
} else {
Strarr.push([str.slice(0,49999)]); // restrict message size if over 50k characters
}
} else {
Strarr.push([found]); // if no match in message, show false
}
将Strarr
推送到ColHarr
(创建2D阵列(不应该在处理了搜索的所有线程的所有消息之后才完成。然后,我可以为下一个搜索项重置Strarr
。
ColHarr.push(Strarr);
Strarr = []; //.length = 0;
ColEarr
的设置值运行良好。对于ColHarr
,我必须找到最大数组的长度来设置Range,但也必须将ColHarr
从锯齿状数组更改为2D
Rubén有一篇关于如何做到这一点的非常有用的帖子。然后我可以使用setValues来显示消息。
//getRange(row, column, numRows, numColumns)
sht.getRange(2, 8, emailVal.length, width).setValues(ColHarr);
我现在所需要做的就是整理单元格的高度和宽度;然后睡一觉。