Скрипт отмены — ячейка КРАСНАЯ

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

Есть ли способ добавить строку в мой текущий сценарий, чтобы он не запускался, если присутствует красная ячейка?

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

Моя ситуация:

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

Есть ли способ добавить строку в мой текущий сценарий, чтобы он не запускался, если присутствует красная ячейка?

Текущий сценарий:

function Email8() {
var ssID = SpreadsheetApp.getActiveSpreadsheet().getId();

var sheetName = SpreadsheetApp.getActiveSpreadsheet().getName();

//var email = Session.getUser().getEmail();

var emailRange = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("S/A - Darrin").getRange("G9:H10");

var emailAddress = emailRange.getValue();

var subject = "S/A - Darrin";

var body = ("Thank you for your business.");


var requestData = {"method": "GET", "headers":{"Authorization":"Bearer "+ScriptApp.getOAuthToken()}};
var shID = getSheetID("S/A - Darrin") //Get Sheet ID of sheet name "Master"
var url = "https://docs.google.com/spreadsheets/d/"+ ssID + "/export?format=pdf&id = "+ssID+"&gid = "+shID;

var result = UrlFetchApp.fetch(url , requestData);  
var contents = result.getContent();

var bcc = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("S/A - Darrin").getRange("F5:G8").getDisplayValues().flat().join(",");var filename = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("S/A - Darrin").getRange("A21").getDisplayValue();
MailApp.sendEmail(emailAddress, subject, body, { attachments: [result.getBlob().setName(`${filename}.pdf`)], bcc });

var ssID = SpreadsheetApp.getActiveSpreadsheet().getId();

  var sheetName = SpreadsheetApp.getActiveSpreadsheet().getName();

  //var email = Session.getUser().getEmail();

  var email_ID1 = "[email protected]";
 
  var subject = "CTC Sales Agreement.";

  var body = ("Attached is your document. \n \Thank you for your business");


  var requestData = {"method": "GET", "headers":{"Authorization":"Bearer "+ScriptApp.getOAuthToken()}};
  var shID = getSheetID("Xero Invoice - Darrin") //Get Sheet ID of sheet name "Xero Invoice - Darrin"
  var url = "https://docs.google.com/spreadsheets/d/"+ ssID + "/export?format=csv&id = "+ssID+"&gid = "+shID;

  var result = UrlFetchApp.fetch(url , requestData);  
  var contents = result.getContent();

  MailApp.sendEmail (email_ID1, subject ,body, {attachments:[{fileName:sheetName+".csv", content:contents, mimeType:"application//csv"}]});

};
function getSheetID(name){
var ss = SpreadsheetApp.getActive().getSheetByName(name)
var sheetID = ss.getSheetId().toString() 
return sheetID
}

Пример таблицы ниже. H1 красный, поэтому необходимо остановить выполнение скрипта. Различные другие ячейки также могли быть красными, поэтому мы надеялись использовать диапазон «A1:K90» в исходной. https://docs.google.com/spreadsheets/d/1JDHDWntR6YVQqgb1lki90dvhRJgFagVAtrrS86H_GBg/edit?gid=0#gid=0

Вам необходимо предоставить публичный доступ к образцу таблицы.

PatrickdC 04.07.2024 14:16
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
1
102
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Используйте getBackgrounds().

Судя по вашему сообщению, если есть одна ячейка красного цвета (#ff0000 в шестнадцатеричном формате), ваш скрипт не должен запускаться. Вы можете добавить оператор if-else перед своим сценарием, чтобы ваш сценарий сначала проверял наличие ячеек с красным фоном перед запуском вашего сценария. В качестве основы для вашего сценария вы можете использовать следующий образец:

function checkingForRed() {
  var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); //change to openByID() and/or openSheetByName() if the sheet to be checked is external.
  var data = ss.getRange(1,1,10,5).getBackgrounds(); //Using 10 and 5 because my sample sheet has no data except for background colors green and red
  var checkForRed = data.filter(x=>x.includes('#ff0000')).length; //will return 0 if there is no red background color
  if (checkForRed) {
    console.info("Script will not run due to cells in red.");
    SpreadsheetApp.getActiveSpreadsheet().toast("Script will not run due to cells in red."); //toast will be visible in sheets ui
  }
  else {
    console.info("Running the script. Place your script inside the else.");
    SpreadsheetApp.getActiveSpreadsheet().toast("Running script."); //toast will be visible in sheets ui
  }
}

Вы можете либо вызвать свой сценарий в операторе else, либо добавить весь сценарий в операторе else. Вы можете изменить диапазон в строке 3 и заменить 10 и 5 на ss.getLastRow() и ss.getLastColumn(), поскольку в моем тестовом листе нет данных, и он выглядит только так (because you have not provided any sample spreadsheet):

Если я запущу образец сценария, журнал выполнения сценария Google Apps должен выглядеть следующим образом:

с всплывающим уведомлением на таких листах:

Ссылка:

ОБНОВЛЯТЬ

Вы можете попробовать изменить приведенный пример сценария следующим образом:

function checkingForRed() {
  var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); //change to openByID() and/or openSheetByName() if the sheet to be checked is external.
  var data = ss.getRange(1,1,10,5).getBackgrounds(); //Using 10 and 5 because my sample sheet has no data except for background colors green and red
  var checkForRed = data.filter(x=>x.includes('#ff0000')).length; //will return 0 if there is no red background color
  if (checkForRed) {
    console.info("Script will not run due to cells in red.");
    SpreadsheetApp.getActiveSpreadsheet().toast("Script will not run due to cells in red."); //toast will be visible in sheets ui
  }
  else {
    console.info("Running the script.");
    SpreadsheetApp.getActiveSpreadsheet().toast("Running script."); //toast will be visible in sheets ui
    Email8(); //<<<<<<<<<<<<<<<<<<<<<<<<This will call your main script `Email8()`
  }
}

или просто поместите все под оператор else:

function Email8() {
  var ssID = SpreadsheetApp.getActiveSpreadsheet().getId();

  var sheetName = SpreadsheetApp.getActiveSpreadsheet().getName();

  var emailRange = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("S/A - Darrin").getRange("G9:H10");

  var emailAddress = emailRange.getValue();

  var subject = "S/A - Darrin";

  var body = ("Thank you for your business.");

  ///////////////////////////////////////////////////////////////////////////////////
  //added script
  var backgroundArray = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("S/A - Darrin").getRange("A1:K").getBackgrounds();
  var checkForRed = backgroundArray.filter(x => x.includes('#ff0000')).length;
  if (checkForRed) {
    console.info("Script will not run due to cells in red.");
    SpreadsheetApp.getActiveSpreadsheet().toast("Script will not run due to cells in red."); //toast will be visible in sheets ui
  }
  else {
    console.info("Running the script.");
    SpreadsheetApp.getActiveSpreadsheet().toast("Running script."); //toast will be visible in sheets ui

  ///////////////////////////////////////////////////////////////////////////////////

    var requestData = { "method": "GET", "headers": { "Authorization": "Bearer " + ScriptApp.getOAuthToken() } };
    var shID = getSheetID("S/A - Darrin") //Get Sheet ID of sheet name "Master"
    var url = "https://docs.google.com/spreadsheets/d/" + ssID + "/export?format=pdf&id = " + ssID + "&gid = " + shID;

    var result = UrlFetchApp.fetch(url, requestData);
    var contents = result.getContent();

    var bcc = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("S/A - Darrin").getRange("F5:G8").getDisplayValues().flat().join(","); var filename = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("S/A - Darrin").getRange("A21").getDisplayValue();
    MailApp.sendEmail(emailAddress, subject, body, { attachments: [result.getBlob().setName(`${filename}.pdf`)], bcc });

    ssID = SpreadsheetApp.getActiveSpreadsheet().getId();

    sheetName = SpreadsheetApp.getActiveSpreadsheet().getName();

    var email_ID1 = "[email protected]";
    subject = "CTC Sales Agreement.";
    body = ("Attached is your document. \n \Thank you for your business");
    requestData = { "method": "GET", "headers": { "Authorization": "Bearer " + ScriptApp.getOAuthToken() } };
    shID = getSheetID("Xero Invoice - Darrin") //Get Sheet ID of sheet name "Xero Invoice - Darrin"
    url = "https://docs.google.com/spreadsheets/d/" + ssID + "/export?format=csv&id = " + ssID + "&gid = " + shID;

    var result = UrlFetchApp.fetch(url, requestData);
    var contents = result.getContent();

    MailApp.sendEmail(email_ID1, subject, body, { attachments: [{ fileName: sheetName + ".csv", content: contents, mimeType: "application//csv" }] });
  } //<<<<<<<<<<<<<dont forget this bracket
};
function getSheetID(name) {
  var ss = SpreadsheetApp.getActive().getSheetByName(name)
  var sheetID = ss.getSheetId().toString()
  return sheetID
}

Привет! Большое спасибо.

V Allan 04.07.2024 10:36

Привет, большое вам спасибо, хотя я изо всех сил пытаюсь понять, что и где разместить в моем существующем сценарии, чтобы он проверял весь лист на наличие красной клетки. Извините, если я веду себя глупо. Еще раз спасибо за вашу помощь.

V Allan 04.07.2024 10:49

Вы можете просто вызвать Email8() в операторе else примера сценария, который я предоставил. Оператор if-else действует как переключение на ваш скрипт.

PatrickdC 04.07.2024 11:45

Я предоставил раздел UPDATE, в котором показано, с чего можно начать модификацию вашего сценария. По сути, вам нужно будет запустить новый function checkingForRed() вместо function Email8(). Также обратите внимание на комментарии в сценарии.

PatrickdC 04.07.2024 11:49

Он перестает работать и выдает мне TypeError: data.filter не является функцией.

V Allan 04.07.2024 13:03

Можете ли вы поделиться образцом таблицы, чтобы я мог протестировать сценарий на своей стороне? Вы изменили диапазон?

PatrickdC 04.07.2024 13:06

Я добавил еще одно обновление, но не смогу полностью его протестировать, если вы не поделитесь образцом электронной таблицы для работы.

PatrickdC 04.07.2024 13:22

Как мне это сделать, пожалуйста. Я поменял диапазон.

V Allan 04.07.2024 13:25

varsheetName = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("S/A - Вики"); //изменяем на openByID() и/или openSheetByName(), если проверяемый лист является внешним. var data = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("S/A - Вики").getRange("A1:K"); var checkForRed = data.filter(x=>x.includes('#ff0000')).length; // вернет 0, если нет красного цвета фона if (checkForRed) {

V Allan 04.07.2024 13:25

можете ли вы попробовать последний код в разделе обновлений? Я интегрировал предоставленный мной образец в ваш сценарий.

PatrickdC 04.07.2024 13:42

Основная концепция добавленного скрипта состоит в том, чтобы просто получить диапазон данных исходной таблицы и проверить цвет фона ячейки на красный, используя getBackgrounds() и простой оператор if-else.

PatrickdC 04.07.2024 13:44

Это наконец сработало. Большое вам спасибо за вашу помощь. Пришлось изменить шестнадцатеричный код с красного на желтый из-за другого текста на мастер-листе, но теперь он работает отлично. Еще раз спасибо.

V Allan 05.07.2024 09:44

Другие вопросы по теме