У меня есть сценарий, который работает отлично, но у меня есть сотрудники, которые будут запускать сценарий, даже если ячейка красного цвета, которая была введена для предотвращения отправки недостающих данных.
Есть ли способ добавить строку в мой текущий сценарий, чтобы он не запускался, если присутствует красная ячейка?
Я рассмотрел различные предложения, но не уверен, как добавить строку в мой текущий сценарий, которая идеально подходит для того, что нам нужно.
Моя ситуация:
У меня есть сценарий, который работает отлично, но у меня есть сотрудники, которые будут запускать сценарий, даже если ячейка красного цвета, которая была введена для предотвращения отправки недостающих данных.
Есть ли способ добавить строку в мой текущий сценарий, чтобы он не запускался, если присутствует красная ячейка?
Текущий сценарий:
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
Судя по вашему сообщению, если есть одна ячейка красного цвета (#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
}
Привет! Большое спасибо.
Привет, большое вам спасибо, хотя я изо всех сил пытаюсь понять, что и где разместить в моем существующем сценарии, чтобы он проверял весь лист на наличие красной клетки. Извините, если я веду себя глупо. Еще раз спасибо за вашу помощь.
Вы можете просто вызвать Email8()
в операторе else примера сценария, который я предоставил. Оператор if-else действует как переключение на ваш скрипт.
Я предоставил раздел UPDATE
, в котором показано, с чего можно начать модификацию вашего сценария. По сути, вам нужно будет запустить новый function checkingForRed()
вместо function Email8()
. Также обратите внимание на комментарии в сценарии.
Он перестает работать и выдает мне TypeError: data.filter не является функцией.
Можете ли вы поделиться образцом таблицы, чтобы я мог протестировать сценарий на своей стороне? Вы изменили диапазон?
Я добавил еще одно обновление, но не смогу полностью его протестировать, если вы не поделитесь образцом электронной таблицы для работы.
Как мне это сделать, пожалуйста. Я поменял диапазон.
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) {
можете ли вы попробовать последний код в разделе обновлений? Я интегрировал предоставленный мной образец в ваш сценарий.
Основная концепция добавленного скрипта состоит в том, чтобы просто получить диапазон данных исходной таблицы и проверить цвет фона ячейки на красный, используя getBackgrounds()
и простой оператор if-else.
Это наконец сработало. Большое вам спасибо за вашу помощь. Пришлось изменить шестнадцатеричный код с красного на желтый из-за другого текста на мастер-листе, но теперь он работает отлично. Еще раз спасибо.
Вам необходимо предоставить публичный доступ к образцу таблицы.