【问题标题】:How to retrieve data from columns dependent upon date如何根据日期从列中检索数据
【发布时间】:2019-07-04 22:38:49
【问题描述】:

我有一个轮换表(固定的轮换顺序(如人员或职责)),这周我已经得到了帮助。它按原样启动并运行,但为了更简单的阅读,我想转置它。

你可以看到我喜欢的转置表here

当前脚本用于预转置表。

它将在 Column 0 中搜索日期。如果是 7 天后,它将从第 1 列检索名称并将其与单独工作表中的电子邮件地址等匹配。

我想做的是将日期放在第 0 行,然后将后续名称放在第 1 行等

我尝试了各种方法。我已经浏览了代码并且可以看到它在做什么,并且我已经阅读了一些关于二维数组的内容,但我似乎无法找到一种方法让代码通过列而不是通过行。

代码如下:

function sendEmails() {
  var ss1 = SpreadsheetApp.getActiveSpreadsheet();
  var sh1 = ss1.getSheetByName("Rota")
  ss1.setActiveSheet(sh1);
  var rotalink = "https://docs.google.com/spreadsheets/d/1LgzUWSAGA2kbpar8r5nosU1bSHF7nrtvtUiHS3nB_e8";
 var sheet = SpreadsheetApp.getActiveSheet();
  // Fetch the range
  var dataRange = sheet.getRange("B3:G50")
  // Fetch values for each row in the Range.
  var data = dataRange.getValues();
  for (i in data)  {
    var row = data[i];
    var today=new Date();
    var timecell = new Date(row[0]);
    var timediff = new Date();
    var one_day=1000*60*60*24;
    var daystogo = Math.ceil((timecell.getTime()-today.getTime())/(one_day));
    if (daystogo==7) {//only e-mail people with one week to go. To change that alter the "7" to the number of days you want
        var subject = "Rota reminder!";
        var emailAddress = [];
        var message;
        message = "Hello \n\n"+
                 "You are down to help at Youth Café this week. \n\n" +

                  "Please see the below rota for your role \n\n" +

                  "If you have any questions or problems let us know at thameyouthcafe@gmail.com \n\n" +

                   "Remember, you can check the rota anytime by clicking on the link below: \n\n"+ 

                  rotalink



for (var x = 1; x < 5; x++) { // 5 because emails are till col4
  //  var emailAddress = []; // Start by collecting the non-blank emails in an array
    if (getEmailFromName(row[x]) != "") {
      emailAddress.push(getEmailFromName(row[x]))
    }
  }
  emailAddress = emailAddress.join();  // Join the array to get a comma separated string
  MailApp.sendEmail(emailAddress, subject, message);
    }
  }
}

这是与 SKey 匹配的 getEmailFromName 函数(我认为它来自第一个函数中的“i”变量?

function getEmailFromName(sKey) {



  // to use this function, don’t put anything in the first column (A) or row (1).

  // Put the name (i.e. the key, or what we’re looking for) in column B.

  // Put what we want to return in column C. 



  var columnToSearch = 1; //column B



  // Set the active sheet to our email lookup

  var ss1 = SpreadsheetApp.getActiveSpreadsheet();

  var sh1 = ss1.getSheetByName("EmailContactList")

  ss1.setActiveSheet(sh1);



  var data = SpreadsheetApp.getActiveSheet().getDataRange().getValues();

  var line = -1;

  for( var i = 0; i < data.length; i++ ) {

    if( data[i][columnToSearch] == sKey ) {

      line = i;

      break;

    }

  }



  if( line != -1 ) {

    //do what you want with the data on "line"

    return data[line][2]; //value on column C of the matched line

  } 

  else {

    return "";

  // if criteria is not found

 }

}

【问题讨论】:

  • 为了正确理解您的目标,您能否将您想要的结果添加到您的共享电子表格中?
  • 抱歉,下班了。不知道我是否可以 - 我不希望数据布局有任何变化。我想要的是查看电子表格第 3 行的代码 - 确定哪个日期符合条件,然后根据他们的姓名与另一张表的匹配情况在该周向相关姓名发送电子邮件。
  • 感谢您的回复。我注意到已经发布了答案。我认为它会解决您的问题。

标签: javascript datetime google-apps-script google-sheets


【解决方案1】:

试试这个方法:

function sendEmails() {
  var ss1 = SpreadsheetApp.getActive();
  var sh1 = ss1.getSheetByName("Rota")
  ss1.setActiveSheet(sh1);
  var rotalink = "https://docs.google.com/spreadsheets/d/1LgzUWSAGA2kbpar8r5nosU1bSHF7nrtvtUiHS3nB_e8";
  var sheet = SpreadsheetApp.getActiveSheet();
  var dataRange = sheet.getRange("B3:G50")
  var data = dataRange.getValues();
  for (var i=0;i<dataRange.length;i++)  {
    var row = data[i];
    var today=new Date();
    var timecell = new Date(row[0]);
    var timediff = new Date();
    var one_day=1000*60*60*24;
    var daystogo = Math.ceil((timecell.getTime()-today.getTime())/(one_day));
    if (daystogo==7) {
      var subject = "Rota reminder!";
      var emailAddress = []; 
      var message = Utilities.formatString('Hello\n\nYou are down to help at Youth Café this week.\n\n Please see the below rota for your role \n\nIf you have any questions or problems let us know at thameyouthcafe@gmail.com \n\nRemember, you can check the rota anytime by clicking on the link below: \n\n%s',rotalink);
      for (var x=1;x<5;x++) { 
        if(data[i][x]) {
          emailAddress.push(data[i][x]);
        }
      }
      MailApp.sendEmail(emailAddress.join(), subject, message);
    }
  }
}

【讨论】:

  • 嗨,抱歉 - 已经离开几天了。感谢您的回复。我已经输入了该代码并修改了最后几行以添加到发送电子邮件功能中。还必须在 dataRange 变量之前添加一行:var sheet= SpreadsheetApp.getActivesheet();,因为它的工作表未被识别。不幸的是,调试没有结果,但同样它似乎也没有做任何事情。如果我查看执行记录,它似乎要做的最后一件事是 Range.getValues。然后以执行成功结束。有什么想法吗?
  • 我猜你需要单步执行程序并弄清楚发生了什么。
  • 试了一步。它停止获取数据范围。关于 for 语句的某些东西正在抛弃它。早上会回去。
【解决方案2】:

设法解决了 - 感谢您的贡献。原来它非常简单。

只需要更改这一行:

var timecell = new Date(data[0])

到这里:

var timecell = new Date(data[0][i])

所以它遍历每一列的第一行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-12
    • 2017-01-25
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多