【问题标题】:Can my appscript code pick data from most recent updated row?我的 appscript 代码可以从最近更新的行中挑选数据吗?
【发布时间】:2021-10-16 07:45:23
【问题描述】:

我不是程序员。通过一些在线帮助,我已经能够编写一个可以将数据从工作表发送到 Slack 通道的代码,但现在的问题是它只从范围中选择第一个单元格。但是,我希望它从最近的行中挑选数据

表单上下文:表单附加到此表单并获取提交,目的是每当有人提交表单时,都会在 slack 上发布一条消息以通知团队

所以,我希望我的代码从最近提交的表单中挑选数据。 P.S 我的整个列都预先填充了公式,所以需要一种像 VLOOKUP 这样的方法,它可以查看一个单元格是否为空白,然后从同一行的另一列中选择数据

CODE is here to view

 
function buildReport() {
  const ss = SpreadsheetApp.getActive();
let data = ss.getSheetByName('Sheet1').getRange("AG9:AH999");
  let payload = buildAlert(data);
  sendAlert (payload);
}

function buildAlert(data) { 
    for (i=0 ; i<20 ; i++) {
      newOrder = data .getvalue(i,1);
    };
  let payload = {
    "blocks": [
        {
            "type": "section",
            "text": {
                "type": "mrkdwn",
                "text": ":bell: *New Order Alert* :bell:"
            }
        },
        {
            "type": "divider"
        },
        {
            "type": "section",
            "text": {
                "type": "mrkdwn",
                "text": newOrder
  }
    },
    ]
  };
  return payload;
}
function sendAlert(payload) {
  const webHook = "https://hooks.slack.com/services/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";// 
  var options = { 
    "method": "post",
    "contentType" : "application/Json" ,
    "muteHttpExceptions" : true ,
    "payload" : JSON.stringify(payload)
  };
  try { 
    UrlFetchApp.fetch(webHook,options);
  } catch(e) { 
    Logger.log(e);
  }
}

【问题讨论】:

  • 您能否提供您的脚本作为文本数据而不是图像数据?如果可以,请将其添加到您的问题中。
  • 将您的代码作为可复制文本提供给我们进行重构
  • @Tanaike 请查看
  • @ABDULLOKHMUKHAMMADJONOV 请查看
  • 提交表单后您会收到什么?

标签: javascript google-sheets-api


【解决方案1】:

如果 Google 表单已附加到您的 Google 表格,您可以使用 表单提交触发器 获取最新回复。

表单提交触发器会在用户在表单中提交响应时自动运行一个函数。它附带一个事件对象,其中包含有关导致触发器触发的上下文的信息。

这里我创建了一个关于如何使用表单提交触发器的示例。每当用户提交响应时,它都会打印响应的值。

表格:

代码:

function onFormSubmit(e){
  Logger.log(e.values);
}

注意:e.values 将返回一个数组,其中的值与它们在电子表格中出现的顺序相同。您也可以使用e.namedValues,它会返回一个包含表单提交的问题名称和值的对象。

设置表单提交触发器:

  1. 在您的 Apps 脚本中,将鼠标悬停在左侧菜单上,然后点击 触发器。
  2. 点击添加触发器。
  3. 如下图所示设置您的触发器。
  4. 点击保存。

触发器设置:

要查看日志,请转到触发器标签下方的执行标签。每个响应都会在 Executions 选项卡中创建一个条目。

输出:

要将其应用到您的代码中,请更改以下内容:

function buildReport() {
  const ss = SpreadsheetApp.getActive();
let data = ss.getSheetByName('Sheet1').getRange("AG9:AH999");
  let payload = buildAlert(data);
  sendAlert (payload);
}

收件人:

function buildReport(e) {
  let response = e.values;
  let data = response[1]; //this will get the column b of the latest response.
  let payload = buildAlert(data);
  sendAlert (payload);
}

触发器设置应如下所示:


对于第 3 方表单(如 jotForms),您可以使用 onChange Trigger。

试试这个:

代码:

function buildReport(e) {
  if(e.changeType == "EDIT"){
    var sh = SpreadsheetApp.getActiveSpreadsheet();
    var ss = sh.getSheetByName("Insert Sheet name here");
    var lastRow = ss.getLastRow();
    var range = ss.getRange(lastRow, 1);
    var data = range.getValue();
    let payload = buildAlert(data);
    sendAlert (payload);
  }
}

触发器设置:

注意:请务必避免手动编辑响应表,因为它也会运行该函数。

参考文献

【讨论】:

  • 感谢您的回答。但是,背面加入的表格是 JotForm 而不是 Google Form。这个触发器还能用吗?
  • @SanaArif - 查看我更新的答案。还要确保指定您在帖子中使用的表格。这是为了向试图回答您问题的人提供更多背景信息,并避免混淆。
  • 感谢您的回答,并为之前未提及而道歉非常感谢您的帮助-它运行良好。你能告诉我我可以在代码中做些什么改变,以确保它读取带有数据的行而不是带有公式的最后一行
  • @SanaArif - 你能提供一个示例电子表格吗?另外,如果您觉得我的回答对您有用,请考虑 accepting or upvoting。
猜你喜欢
  • 2018-04-26
  • 1970-01-01
  • 1970-01-01
  • 2019-10-31
  • 1970-01-01
  • 1970-01-01
  • 2011-12-02
  • 1970-01-01
相关资源
最近更新 更多