数组以填充工作表上的多列



在范围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);

我现在所需要做的就是整理单元格的高度和宽度;然后睡一觉。