Триггер срабатывает для всех правок, а не только для определенных ячеек

avatar
Scott Shimer
8 августа 2021 в 20:52
103
1
0

Я пытаюсь сделать так, чтобы изменения, сделанные на листе, автоматически отправлялись в Slack, чтобы предупредить людей. Этот аспект отлично работает. Однако вместо того, чтобы срабатывать только тогда, когда у меня есть изменение в предопределенном диапазоне, он срабатывает при всех изменениях независимо от вкладки.

вот код, который я использую в скрипте приложения:

function buildReport() {
  const ss = SpreadsheetApp.getActive();
  let data = ss.getSheetByName('Mirror').getRange("A1:B13").getValues();
  let payload = buildAlert(data);
  sendAlert(payload);
}
 
 
function buildAlert(data) {
  let totalRevenue = data[0][1];
  let revenueBreakdown = data.slice(1).map(function(row) {
    return row[0] + ": " + row[1];
  }).join("\n");
 
  let payload = {
    "blocks": [
      {
        "type": "divider"
      },
      {
        "type": "section",
        "text": {
          "type": "mrkdwn",
          "text": " *2021 IFL FOOTBALL DRAFT* "
        }
      },
      
      {
        "type": "section",
        "text": {
          "type": "mrkdwn",
          "text": "Round " + totalRevenue
        }
      },
      {
        "type": "section",
        "text": {
          "type": "mrkdwn",
          "text": "Drafted Players:"
        }
      },
      {
        "type": "section",
        "text": {
          "type": "mrkdwn",
          "text": revenueBreakdown
        }
      }
    ]
  };
  return payload;
}
 
function sendAlert(payload) {
  const webhook = "https://hooks.slack.com/services/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"; //Paste your webhook URL here
  var options = {
    "method": "post", 
    "contentType": "application/json", 
    "muteHttpExceptions": true, 
    "payload": JSON.stringify(payload) 
  };
  
  try {
    UrlFetchApp.fetch(webhook, options);
  } catch(e) {
    Logger.log(e);
  }
}

Мы будем очень признательны за любую помощь! Опять же, мне нужно, чтобы триггер срабатывал только тогда, когда были внесены изменения в определенный диапазон, а не на весь лист.

Источник

Ответы (1)

avatar
pgSystemTester
8 августа 2021 в 21:10
3

У вас должны быть некоторые условия, чтобы проверить, какой диапазон ячеек выполняется, прежде чем запускать что-либо еще.

Рассмотрите что-то вроде приведенного ниже кода. Вы можете отредактировать, чтобы включить такие условия, как редактируемая только одна ячейка, или рассмотреть, попадает ли первая строка (не последняя) в диапазон.

function onEdit(e) {
  const maxCol = 2;
  const maxRow = 13;

  var range = e.range;
  if (range.getLastColumn() <= maxCol && range.getLastRow() <= maxRow) {
    //Run your code.
    let data = ss.getSheetByName('Mirror').getRange("A1:B13").getValues();
    let payload = buildAlert(data);
    sendAlert(payload);
  }
}
Scott Shimer
8 августа 2021 в 22:40
0

Спасибо за ответ! Я определенно новичок в кодировании и мог заимствовать код здесь и там. Когда я добавляю функцию onEdit, я получаю TypeError: Не удается прочитать «диапазон» свойств неопределенного onEdit Любая идея, почему?

Yuri Khristich
8 августа 2021 в 23:01
1

@ScottShimer, обычно вы не можете запустить функцию onEdit() из редактора сценариев. Это одна из специальных функций GAS. Он срабатывает автоматически каждый раз, когда вы редактируете свой лист (вручную).

pgSystemTester
9 августа 2021 в 01:35
0

@YuriKhristich прав. Эта ошибка возникает только при первом выполнении ее ВРУЧНУЮ. Однако, как только вы запустите его и включите все разрешения, он будет выполняться каждый раз, когда редактируется ячейка.

Scott Shimer
9 августа 2021 в 15:19
0

Каждый раз, когда я запускаю его, я получаю сообщение об ошибке ... TypeError: Не удается прочитать «диапазон» свойства undefined onEdit @ draft.gs: 5 Было бы проще, если бы оно было специфичным для листа, а не для диапазона? у меня есть 15 других листов в электронной таблице, которые я не хочу запускать при редактировании, но любое редактирование в «Зеркале» будет в порядке. Еще раз за помощь!

pgSystemTester
9 августа 2021 в 15:52
0

Конечно, вы могли бы включить имя листа. Просто встройте это условие в оператор if. if (range.getLastColumn() <= maxCol && range.getLastRow() <= maxRow && range.getSheet().getName()=="Mirror")

pgSystemTester
9 августа 2021 в 15:53
0

Эта ошибка, которую вы получаете, по-прежнему связана с тем, что вы ВРУЧНУЮ запускаете процедуру. Он будет работать, если он запускается автоматически (т. е. измените ячейку в электронной таблице, а не из редактора).