Apps Script中indexOf()处理跨行邮件正文时返回-1的问题求助
排查思路与解决方法
看起来你遇到的核心问题是字符串匹配的精确性和换行符干扰导致indexOf()找不到目标子串,下面一步步拆解问题并给出解决方向:
1. 先排查最容易忽略的「字符串精确匹配」问题
你提到要提取的子串是Current status- ROB2ReOnb(注意status和-之间没有空格),但你的代码里用的是body.indexOf("Current status -")(这里status和-之间有空格)。这很可能是第一个坑:
- 先复制邮件正文中的
Current status-(或其附近的完整片段)到代码里,替换掉手动输入的字符串,避免因空格、全角/半角符号差异导致匹配失败。
2. 查看邮件正文中的「隐藏换行/空白字符」
邮件正文的换行通常不是单纯的\n,可能是\r\n(Windows格式),甚至夹杂制表符\t或多个空格。当目标文本跨多行时,indexOf()只能匹配连续的字符串,如果Current status -和后续内容之间有换行,你手动写的字符串就和实际内容不匹配了。
排查方法:
把邮件正文转成「可见字符格式」输出,比如在代码里加一行:
console.log('处理前的正文:', body.replace(/\r/g, '\\r').replace(/\n/g, '\\n').replace(/\t/g, '\\t'));
这样你就能清楚看到:
Current status -周围有没有隐藏的换行/制表符- 目标子串的换行符是
\r、\n还是\r\n
3. 解决跨多行匹配的问题
如果确认目标子串确实跨多行,indexOf()的连续字符串匹配就不适用了,推荐用正则表达式来处理,它可以忽略换行或匹配跨多行内容:
示例代码(适配跨多行场景):
// 使用正则匹配,允许status和-之间有任意空白(包括换行),并捕获到ROB2ReOnb部分 const regex = /Current status\s*-\s*(.*?)(?=Active with App)/s; const match = body.match(regex); if (match) { const current_status = `Current status- ${match[1].trim()}`; // 拼接成你需要的格式 console.log(current_status); } else { console.log('未找到目标内容'); }
这里的关键参数:
\s*:匹配任意数量的空白字符(包括空格、换行、制表符),解决跨换行或空格不一致的问题(?=Active with App):正向预查,确保匹配到Active with App之前的内容,替代indexOf()的结束位置/s修饰符:让正则中的.匹配换行符,支持跨多行匹配
4. 临时替代方案:先统一处理换行符
如果不想用正则,可以先把所有换行符替换成空格,再用indexOf():
const processedBody = body.replace(/[\r\n]/g, ' '); // 把所有换行转成空格 const startIdx = processedBody.indexOf("Current status -"); // 这里要确保字符串和处理后的正文匹配 const endIdx = processedBody.indexOf("Active with App"); if (startIdx !== -1 && endIdx !== -1) { let current_status = processedBody.substring(startIdx, endIdx).trim(); // 如果需要把多余的空格换成单个空格 current_status = current_status.replace(/\s+/g, ' '); console.log(current_status); }
内容的提问来源于stack exchange,提问作者user14491665
相关产品推荐
相关产品推荐

