Google 应用程序脚本仅提取包含数据的行
Google App Script Only Pull Rows With Data
我有一个 google sheet 每天根据今天的日期填充不断变化的数据,我想做的是每天将有数据的每一行推送到 Slack 频道一个时间触发器。如您所见,我开始构建它,使每个单元格都有自己的变体,但是当第 3 行没有数据时,它仍会像这样将空白更新推送到 Slack 中:
我猜我需要在这里的某处添加一个 IF,但不确定在哪里。这是代码:
function createMeetingMessage(sheet) {
var porow1 = "Bulk!A2";
var OrderDaterow1 = "Bulk!K2";
var OrderReqrow1 = "Bulk!J2";
var Desrow1 = "Bulk!D2";
var Vendorrow1 = "Bulk!E2";
var ETArow1 = "Bulk!L2";
var porow2 = "Bulk!A3";
var OrderDaterow2 = "Bulk!K3";
var OrderReqrow2 = "Bulk!J3";
var Desrow2 = "Bulk!D3";
var Vendorrow2 = "Bulk!E3";
var ETArow2 = "Bulk!L3";
var porow3 = "Bulk!A4";
var OrderDaterow3 = "Bulk!K4";
var OrderReqrow3 = "Bulk!J4";
var Desrow3 = "Bulk!D4";
var Vendorrow3 = "Bulk!E4";
var ETArow3 = "Bulk!L4";
var message = "> *Today's Purchases*" +"\n"
+ "> *PO:* " +sheet.getRange(porow1).getValue() +"\n"
+ "> *Order Date:* " +sheet.getRange(OrderDaterow1).getValue() +"\n"
+ "> *Requested By:* " +sheet.getRange(OrderReqrow1).getValue() +"\n"
+ "> *Description:* " +sheet.getRange(Desrow1).getValue() +"\n"
+ "> *Vendor:* " +sheet.getRange(Vendorrow1).getValue() +"\n"
+ "> *ETA:* " +sheet.getRange(ETArow1).getValue() +"\n"
+"\n"
+ "> *PO:* " +sheet.getRange(porow2).getValue() +"\n"
+ "> *Order Date:* " +sheet.getRange(OrderDaterow2).getValue() +"\n"
+ "> *Requested By:* " +sheet.getRange(OrderReqrow2).getValue() +"\n"
+ "> *Description:* " +sheet.getRange(Desrow2).getValue() +"\n"
+ "> *Vendor:* " +sheet.getRange(Vendorrow2).getValue() +"\n"
+ "> *ETA:* " +sheet.getRange(ETArow2).getValue() +"\n"
+"\n"
+ "> *PO:* " +sheet.getRange(porow3).getValue() +"\n"
+ "> *Order Date:* " +sheet.getRange(OrderDaterow3).getValue() +"\n"
+ "> *Requested By:* " +sheet.getRange(OrderReqrow3).getValue() +"\n"
+ "> *Description:* " +sheet.getRange(Desrow3).getValue() +"\n"
+ "> *Vendor:* " +sheet.getRange(Vendorrow3).getValue() +"\n"
+ "> *ETA:* " +sheet.getRange(ETArow3).getValue() +"\n";
return message;
}
function triggerSlackRequestPD(channel, msg) {
var slackWebhook = "[SLACK WEBHOOK]";
var payload = { "channel": channel, "text": msg, "link_names": 1, "username": "Procurementron", "icon_emoji": ":robot_face:" };
var options = { "method": "post", "contentType": "application/json", "muteHttpExceptions": true, "payload": JSON.stringify(payload) };
Logger.log(UrlFetchApp.fetch(slackWebhook, options));
}
function notifySlackChannelOfFacilitatorAndNoteTaker() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Bulk");
if (!sheet.getRange("B2").getValue()) return;
var channel = getChannel();
var msg = createMeetingMessage(sheet);
triggerSlackRequestPD(channel, msg);
}
function isTest() {
return false;
}
function getChannel() {
if(isTest()) {
return "[SLACK CHANNEL]";
} else {
return "[SLACK CHANNEL]";
}
}
愿意接受任何和所有的建议。理想情况下,列中有一个 like var get.alldata,这样我就不必为每个单元格创建一个变体。谢谢!
- 当
porow3, OrderDaterow3, OrderReqrow3, Desrow3, Vendorrow3, ETArow3
为空时,您不想将它们包含在 message
中。
如果我的理解是正确的,这个修改怎么样?我认为您的情况有几种解决方案。所以请将此视为其中之一。
修改点:
- 我认为在你的脚本中,需要修改
createMeetingMessage()
。
- 在
createMeetingMessage()
处,所有值都是常量范围,每条消息的所有标签也相同。
- 我觉得这些情况可以用来修改你的脚本
- 在您的脚本中,您使用
getValue()
检索值。
- 使用
getValues()
检索所有值。
当以上几点反映到你的脚本中,脚本如下。
修改后的脚本:
请将您的createMeetingMessage()
修改为以下脚本,然后试一下。
function createMeetingMessage(sheet) {
var values = sheet.getRange("Bulk!A2:L4").getValues(); // Please modify this range, if you want to add rows.
var message = values.reduce(function(s, e) {
var porow, OrderDaterow, OrderReqrow, Desrow, Vendorrow, ETArow, _,
[porow, _, _, Desrow, Vendorrow, _, _, _, _, OrderReqrow, OrderDaterow, ETArow] = e;
if (porow && OrderDaterow && OrderReqrow && Desrow && Vendorrow && ETArow) {
s += "> *PO:* " + porow +"\n"
+ "> *Order Date:* " + OrderDaterow +"\n"
+ "> *Requested By:* " + OrderReqrow +"\n"
+ "> *Description:* " + Desrow +"\n"
+ "> *Vendor:* " + Vendorrow +"\n"
+ "> *ETA:* " + ETArow +"\n"
+"\n";
}
return s;
}, "> *Today's Purchases*" +"\n");
return message;
}
注:
- 在此修改后的脚本中,每行的所有
porow, OrderDaterow, OrderReqrow, Desrow, Vendorrow, ETArow
值均已存在,它们包含在消息中。
- 如果要修改,请修改这里。
- 如果要添加行,请修改
var values = sheet.getRange("Bulk!A2:L4").getValues()
的Bulk!A2:L4
。
参考文献:
我有一个 google sheet 每天根据今天的日期填充不断变化的数据,我想做的是每天将有数据的每一行推送到 Slack 频道一个时间触发器。如您所见,我开始构建它,使每个单元格都有自己的变体,但是当第 3 行没有数据时,它仍会像这样将空白更新推送到 Slack 中:
我猜我需要在这里的某处添加一个 IF,但不确定在哪里。这是代码:
function createMeetingMessage(sheet) {
var porow1 = "Bulk!A2";
var OrderDaterow1 = "Bulk!K2";
var OrderReqrow1 = "Bulk!J2";
var Desrow1 = "Bulk!D2";
var Vendorrow1 = "Bulk!E2";
var ETArow1 = "Bulk!L2";
var porow2 = "Bulk!A3";
var OrderDaterow2 = "Bulk!K3";
var OrderReqrow2 = "Bulk!J3";
var Desrow2 = "Bulk!D3";
var Vendorrow2 = "Bulk!E3";
var ETArow2 = "Bulk!L3";
var porow3 = "Bulk!A4";
var OrderDaterow3 = "Bulk!K4";
var OrderReqrow3 = "Bulk!J4";
var Desrow3 = "Bulk!D4";
var Vendorrow3 = "Bulk!E4";
var ETArow3 = "Bulk!L4";
var message = "> *Today's Purchases*" +"\n"
+ "> *PO:* " +sheet.getRange(porow1).getValue() +"\n"
+ "> *Order Date:* " +sheet.getRange(OrderDaterow1).getValue() +"\n"
+ "> *Requested By:* " +sheet.getRange(OrderReqrow1).getValue() +"\n"
+ "> *Description:* " +sheet.getRange(Desrow1).getValue() +"\n"
+ "> *Vendor:* " +sheet.getRange(Vendorrow1).getValue() +"\n"
+ "> *ETA:* " +sheet.getRange(ETArow1).getValue() +"\n"
+"\n"
+ "> *PO:* " +sheet.getRange(porow2).getValue() +"\n"
+ "> *Order Date:* " +sheet.getRange(OrderDaterow2).getValue() +"\n"
+ "> *Requested By:* " +sheet.getRange(OrderReqrow2).getValue() +"\n"
+ "> *Description:* " +sheet.getRange(Desrow2).getValue() +"\n"
+ "> *Vendor:* " +sheet.getRange(Vendorrow2).getValue() +"\n"
+ "> *ETA:* " +sheet.getRange(ETArow2).getValue() +"\n"
+"\n"
+ "> *PO:* " +sheet.getRange(porow3).getValue() +"\n"
+ "> *Order Date:* " +sheet.getRange(OrderDaterow3).getValue() +"\n"
+ "> *Requested By:* " +sheet.getRange(OrderReqrow3).getValue() +"\n"
+ "> *Description:* " +sheet.getRange(Desrow3).getValue() +"\n"
+ "> *Vendor:* " +sheet.getRange(Vendorrow3).getValue() +"\n"
+ "> *ETA:* " +sheet.getRange(ETArow3).getValue() +"\n";
return message;
}
function triggerSlackRequestPD(channel, msg) {
var slackWebhook = "[SLACK WEBHOOK]";
var payload = { "channel": channel, "text": msg, "link_names": 1, "username": "Procurementron", "icon_emoji": ":robot_face:" };
var options = { "method": "post", "contentType": "application/json", "muteHttpExceptions": true, "payload": JSON.stringify(payload) };
Logger.log(UrlFetchApp.fetch(slackWebhook, options));
}
function notifySlackChannelOfFacilitatorAndNoteTaker() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Bulk");
if (!sheet.getRange("B2").getValue()) return;
var channel = getChannel();
var msg = createMeetingMessage(sheet);
triggerSlackRequestPD(channel, msg);
}
function isTest() {
return false;
}
function getChannel() {
if(isTest()) {
return "[SLACK CHANNEL]";
} else {
return "[SLACK CHANNEL]";
}
}
愿意接受任何和所有的建议。理想情况下,列中有一个 like var get.alldata,这样我就不必为每个单元格创建一个变体。谢谢!
- 当
porow3, OrderDaterow3, OrderReqrow3, Desrow3, Vendorrow3, ETArow3
为空时,您不想将它们包含在message
中。
如果我的理解是正确的,这个修改怎么样?我认为您的情况有几种解决方案。所以请将此视为其中之一。
修改点:
- 我认为在你的脚本中,需要修改
createMeetingMessage()
。 - 在
createMeetingMessage()
处,所有值都是常量范围,每条消息的所有标签也相同。- 我觉得这些情况可以用来修改你的脚本
- 在您的脚本中,您使用
getValue()
检索值。- 使用
getValues()
检索所有值。
- 使用
当以上几点反映到你的脚本中,脚本如下。
修改后的脚本:
请将您的createMeetingMessage()
修改为以下脚本,然后试一下。
function createMeetingMessage(sheet) {
var values = sheet.getRange("Bulk!A2:L4").getValues(); // Please modify this range, if you want to add rows.
var message = values.reduce(function(s, e) {
var porow, OrderDaterow, OrderReqrow, Desrow, Vendorrow, ETArow, _,
[porow, _, _, Desrow, Vendorrow, _, _, _, _, OrderReqrow, OrderDaterow, ETArow] = e;
if (porow && OrderDaterow && OrderReqrow && Desrow && Vendorrow && ETArow) {
s += "> *PO:* " + porow +"\n"
+ "> *Order Date:* " + OrderDaterow +"\n"
+ "> *Requested By:* " + OrderReqrow +"\n"
+ "> *Description:* " + Desrow +"\n"
+ "> *Vendor:* " + Vendorrow +"\n"
+ "> *ETA:* " + ETArow +"\n"
+"\n";
}
return s;
}, "> *Today's Purchases*" +"\n");
return message;
}
注:
- 在此修改后的脚本中,每行的所有
porow, OrderDaterow, OrderReqrow, Desrow, Vendorrow, ETArow
值均已存在,它们包含在消息中。- 如果要修改,请修改这里。
- 如果要添加行,请修改
var values = sheet.getRange("Bulk!A2:L4").getValues()
的Bulk!A2:L4
。