Google表格公式提供的价值尚不存在

时间:2019-08-23 01:27:44

标签: google-apps-script google-sheets google-sheets-formula

我正在尝试创建一个公式,该公式将在随机单元格中出现但尚未发生的文本字符串中查找数字(一旦有人从中选择一个选项,该值便会显示在电子表格中Google表单)。一旦值出现,我就能使公式正常工作,但是我需要它能够在值出现之前寻找值。不知道如何更好地解释它,但这是一个场景:

用户可以在Google表单上选择50个选项。他们选择选项“项目203”。然后将“项目203”添加到电子表格,并对其进行选择的次数进行计数。当选择“ Item 203”达到20次时,会将电子邮件发送给指定的人。

我的问题是,有时未选择所有项目,因此“ Item 203”并不总是显示在同一单元格中。我似乎无法弄清楚。如果有人有任何建议会很有帮助。谢谢!

编辑: 如果该值不存在,那么它将不执行任何操作。它仅查找项目的编号部分。因此,如果存在“项目203,项目204,项目205等”我需要让公式计算203发生的次数,以及是否在20时发送电子邮件。然后,我需要对项目204执行相同的操作,只是电子邮件的收件人不同,依此类推。我正在尝试制定一个现在可以使用的公式,但是还不完全可以。如果我发现一个可行或至少可行的软件,我将其发布。

这是我用来计算C列中项目的公式。

=ArrayFormula(QUERY(C1:C3000&{"",""},"select Col1, count(Col2) where Col1 != '' group by Col1 label count(Col2) 'Count'",1))

我希望这样的事情发生。我的问题是,我不知道Item 203会进入哪个单元格,因为人们不会每天选择相同的项目。我确实知道我想以20为单位发送电子邮件。

// Fetch the email address 
var emailRange = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1").getRange("B2"); 
var emailAddress = emailRange.getValues();
// Send Alert Email. 
var message = 'This is your Alert email!';
// Second column 
var subject = 'Your Google Spreadsheet Alert'; 
MailApp.sendEmail(emailAddress, subject, message);

“ getRange(“ B2”)对我不起作用,因为项目203并不总是以单元格B2结尾。

编辑2: 这是我目前拥有的脚本。现在,当我单击表单上的“提交”时,它会通过电子邮件发送给我,因为我设置了自动触发器,可以在每次提交表单时运行脚本。我希望它能够等待给我发送电子邮件,直到满足“商品203”(或任何商品编号)的条件为止。我希望它在满足“项目204”条件时通过电子邮件发送给其他人。如果同时满足多个条件,即:“项目203和204都达到20个选择”,则会通过电子邮件向我发送203,向他人发送204的电子邮件。现在可以正常记录日志,但我必须手动运行脚本才能将其发送到工作。

function autoEmail(){
      sendEmail();
      myFunction();
}
function myFunction() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Daily 
Count"); 
  var data = sheet.getDataRange().getDisplayValues();
  var total = {"Item 203": 0, "Item 204": 0};

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

    for(var j=0; j<row.length ; j++) {
      var cell = row[j];

      for(item in total) {
        var replace = item;
        var re = new RegExp(replace,"g");
        var count = (cell.match(re) || []).length;
        total[replace] += count;
      }
    }    
  }
  Logger.log(total);
}
function sendEmail() {
  // Fetch the email address 
var emailRange = 
SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Daily 
Count").getRange("H4"); 
var emailAddress = emailRange.getValues();
// Send Alert Email. 
var message = 'My test email.';
// Second column 
var subject = 'This is a test.'; 
MailApp.sendEmail(emailAddress, subject, message);
}

1 个答案:

答案 0 :(得分:0)

您可以使用getDataRange()[1]函数,该函数将检索工作表内有数据的完整范围。您可以在每个单元格中搜索项目字符串,然后在JSON对象中添加每个项目的出现。

这是我实现的代码,它将在整个响应表中搜索“总计” JSON中的每个属性(项目)。

function myFunction() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Form responses 1"); 
  var data = sheet.getDataRange().getDisplayValues();
  var total = {"Item 203": 0, "Item 204": 0};

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

    for(var j=0; j<row.length ; j++) {
      var cell = row[j];

      for(item in total) {
        var replace = item;
        var re = new RegExp(replace,"g");
        var count = (cell.match(re) || []).length;
        total[replace] += count;
      }
    }    
  }
  Logger.log(total);
}

[1] https://developers.google.com/apps-script/reference/spreadsheet/sheet#getdatarange