首页 > 解决方案 > 应用程序脚本 - 关于如何继续分配给数组然后提取数组中每个最后一个连续日期的建议

问题描述

我遇到的问题如下:

这是我从该发件人那里收到的电子邮件(格式始终相同,行数差异很大(4 到 100)(电子邮件内的表格): 我已修改此代码以满足我的需要

**我使用“|”来表示单元格值**

电子邮件内容示例:

“早上好

TEST Emergency 有以下 CMO 职位空缺——希望您能提供帮助

日期 | 班次 | 部门 | 职位 | 医院 | 每小时速率

2020 年 11 月 16 日,星期一 | 0800-1800 | 紧急情况 | 首席营销官 | 测试 |$130

2020 年 11 月 16 日,星期一 | 1400-2400 | 紧急情况 | 首席营销官 | 测试 |$145

2020 年 11 月 17 日,星期二 | 1400-2400 | 紧急情况 | 首席营销官 | 测试 |$145

2020 年 11 月 22 日,星期日 | 1200-2200 | 紧急情况 | 首席营销官 | 测试 |$145

....签名”

我正在使用这段代码来提取它:

 var SEARCH_QUERY = 'label: Testing';

function appendData_(sheet, array2d) {
    sheet.getRange(sheet.getLastRow() + 1, 1, array2d.length, array2d[0].length).setValues(array2d);
}
// Main function, the one that you must select before run
function saveEmails() {
    var array2d = getEmails_(SEARCH_QUERY);
    if (array2d) {
        appendData_(SpreadsheetApp.getActiveSheet(), array2d);
    }
}

// Will get the emails and return a list
function getEmails_(q) {
    var emails = [];
    // Sheet header columns 
    emails.push(["Date","Shift","Department","Hospital","Rate"]);

    var threads = GmailApp.search(q);

    for (var i in threads) {
        var thread=threads[i];

        //var data = threads[i].getPlainBody();
        var msgs = threads[i].getMessages();
        for (var j in msgs) {
            var msg = msgs[j];

            // A different attempt at extraction
          var data = msg.getPlainBody().replace(/(Kee(.|\n|\r)*)/ig,'').replace(/(\r\n\r\n)/g,',').replace(/(.)*help/g,'').replace(/((\w)*day)/g,'').split('\\W+');//.match(/(16 November 2020)/ig);
          
          //Extracting values and assigning to arrays 
          var shiftdate = msg.getPlainBody().match(/(\d{1,2}\s(Jan|January|Feb|February|Mar|March|Apr|April|May|Jun|June|Jul|July|Aug|August|Sep|Sept|September|Oct|October|Nov|November|Dec|December)\s\d{4})/ig);
          var shifttime = msg.getPlainBody().match(/(\d{4}-\d{4})/ig);
          var department = msg.getPlainBody().match(/(EMERGENCY)/g);
          var hospital = msg.getPlainBody().match(/(TEST)/g);                     
          var rate = msg.getPlainBody().match(/(\$\d{3})/g);
        
 // for (let i=0 i < shiftdate.length; i++){
            emails.push([shiftdate,shifttime,department,hospital,rate]);
         //  }
    }
    return emails;
   console.log(emails)
}

//Will clear the sheet and add all emails there
function appendData_(sheet, array2d) {
  sheet.clear();
  sheet.getRange(sheet.getLastRow() + 1, 1, array2d.length, array2d[0].length).setValues(array2d);
}

现在上面的代码让我明白了这一点:

[“日期”、“班次”、“科室”、“医院”、“费率”]、[[“2020 年 11 月 16 日”、“2020 年 11 月 16 日”、“2020 年 11 月 17 日”、“2020 年 11 月 22 日”]、[ “0800-1800”、“1400-2400”、“1400-2400”、“1200-2200”]、[“紧急”、“紧急”、“紧急”、“紧急”]、[“测试”、“测试” ','测试','测试'],['$130','$145','$145','$145']]]

将数据插入电子表格时,我在上面看到的问题是执行后 A,B,C,D,E,F 都包含它们各自的数组并且只显示第一个值,所以我在想添加一个for循环以重复.setvalues ...

日期 | 班次 | 部门 | 职位 | 医院 | 每小时速率

2020 年 11 月 16 日 | 0800-1800 | 紧急情况 | 首席营销官 | 测试 |$130

我不确定如何进行,因为我的最终目标如下:

最后,我想进一步处理数据,以便 Row 显示:

开始日期(当前标记为日期)| 结束日期 | 班次开始 | 班次结束 | 部门 | 职位 | 医院 | 每小时速率

这意味着脚本需要遍历日期并比较 Date + TIME 数组和连续日期,然后将每个最后一个连续日期推送到数组“结束日期”。这需要与时间进行比较(我可以稍后拆分该数组)。

现在,我无法弄清楚:最好的方法是什么?

  1. 我现在是否应该尝试将数据插入列并将每个数组推送到它自己的列,然后创建一个单独的代码,该代码将首先对工作表进行排序,然后读取每一行并比较日期和时间以找到连续的值?在这种情况下:

1.1。在当前记录的数组上运行 for 循环时,它似乎会跳过重复的值——尽管这些值很重要,因为它表示不同的开始时间。

  1. 我是否应该使用每个数组的第一个、第二个等值创建新数组,然后将它们放入带有 if 语句的 for 循环中?匹配开始时间,然后将最后一个连续数组中的 [0] 值重新分配到新数组中?还是删除所有连续的数组值(第一个和最后一个除外)然后再添加一个步骤会更好吗?同样,我担心在使用 .length 和分配时代码会跳过重复值?

下面的代码片段就足够了吗?:

firstArray [16 November 2020],[0800-1800],[EMERGENCY],[CMO],[TEST],[$130]
secondArray[17 November 2020],[1400-2400],[EMERGENCY],[CMO],[TEST],[$145]
third Array[17 November 2020],[0800-1800],[EMERGENCY],[CMO],[TEST],[$145]


for(var line in firstArray) 
{
 var isMatched = secondArray.indexOf(firstArray[1]); 
 if (isMatched !== -1) 
 {
   var matchedValFromArray2 = secondArray.indexof[1][isMatched]
 };

}


我不知道如何进行进一步的数据提取。希望问题足够清楚,并且有人会提出一些建议......

标签: javascriptarraysdategoogle-apps-scriptgoogle-sheets

解决方案


我认为这与您尝试做的类似:

function example1() {
  const s='one|two|three|four|five\r1|2|3|4|5\rA|B|C|D|E\ra|b|c|d|e';//simpified version of your data after removing unnecessary lines
  let a=s.split(/\r/);//split on carriage returns to get each line in a row
  a.splice(0,0,'Col1|Col2|Col3|Col4|Col5|Col6|Col7');//add titles
  let dt=Utilities.formatDate(new Date(),Session.getScriptTimeZone(),"E MMM dd, yyyy HH:mm:ss");
  let b=a.map((r,i) =>{
              let t=r.split('|');//split for columns
  if(i>0) {
    t.splice(0,0,dt);//insert date at beginning
    t.splice(3,0,'whatever');//insert whatever in column4
  }
  return t;
});
const ss=SpreadsheetApp.getActive();
const sh=ss.getActiveSheet();
sh.clearContents();//just did this to clear out previous data while developing
sh.getRange(1,1,b.length,b[0].length).setValues(b);
}

推荐阅读