Имеются 10 листов, в которых происходит то самое действие.
Как можно оптимизировать код, чтобы не писать этот код для каждого листа, с выводом результата в свой лист?
function onEdit(е) {
var statusIn = "REQUEST IN PROCESS";
var ss = SpreadsheetApp.getActiveSpreadsheet()
var sen = ss.getSheetByName(Sheet1).getRange("B2").getValue();
var rasa = sen.length;
var bar_r1 = ss.getSheetByName(Sheet1).getRange("F5").getValue();
var re1 = bar_r1.length;
var bar_r = ss.getSheetByName(Sheet1).getRange("B5").getValue();
var re = bar_r.length;
var bar_r2 = ss.getSheetByName(Sheet1).getRange("J5").getValue();
var re2 = bar_r2.length;
var bar_r3 = ss.getSheetByName(Sheet1).getRange("N5").getValue();
var re3 = bar_r3.length;
if (re > rasa) {
ss.getSheetByName(Sheet1).getRange("B2").setValue(statusIn);
}
if (re2 > rasa) {
ss.getSheetByName(Sheet1).getRange("B2").setValue(statusIn);
}
if (re1 > rasa) {
ss.getSheetByName(Sheet1).getRange("B2").setValue(statusIn);
}
if (re3 > rasa) {
ss.getSheetByName(Sheet1).getRange("B2").setValue(statusIn);
}
// Следующий лист
var senr = ss.getSheetByName(rozp).getRange("B2").getValue();
var rasar = senr.length;
var bar_rr = ss.getSheetByName(rozp).getRange("B5").getValue();
var rer = bar_rr.length;
var bar_r1r = ss.getSheetByName(rozp).getRange("F5").getValue();
var re1r = bar_r1r.length;
var bar_r2r = ss.getSheetByName(rozp).getRange("J5").getValue();
var re2r = bar_r2r.length;
var bar_r3r = ss.getSheetByName(rozp).getRange("N5").getValue();
var re3r = bar_r3r.length;
if (rer > rasar) {
ss.getSheetByName(rozp).getRange("B2").setValue(statusIn);
}
if (re1r > rasar) {
ss.getSheetByName(rozp).getRange("B2").setValue(statusIn);
}
if (re2r > rasar) {
ss.getSheetByName(rozp).getRange("B2").setValue(statusIn);
}
if (re3r > rasar) {
ss.getSheetByName(rozp).getRange("B2").setValue(statusIn);
}
}
По ответу уважаемого 'oshliaer' пробовал подписать код для следующей фикции но при выполнении всё работает, только во всех листах одновременно, а не в том в котором была нажата кнопка с функцией.
"use strict";
function finish() {
try{
var statusFin = "REQUEST FINISH";
var ss = SpreadsheetApp.getActiveSpreadsheet();
var each = function(){
return function(tabl){
go(ss, tabl, statusFin);
}
}();
var items1 = ['Sheet1', 'Sheet2', 'Sheet3', 'rozp'];
items1.forEach(each);
SpreadsheetApp.getActive().toast("REQUEST FINISH","STATUS", 30);
}
catch(err){
throw err;
}
}
function go(ss, tabl, statusFin) {
ss.getSheetByName(tabl).getRange("B2").setValue(statusFin);}
Можна написать функцию для каждого листа:
function Fin_Sheet1() {
ss.getSheetByName(Sheet1).getRange("B2").setValue(statusFin);}
Но хочется разобраться с кодом который выше. Что я упустил?
Как вариант
"use strict";
function onEdit(е) {
try{
var statusIn = "REQUEST IN PROCESS";
var ss = SpreadsheetApp.getActiveSpreadsheet()
var eacher = function(){
return function(name){
action(ss, name, statusIn);
}
}();
var items = ['Sheet1', 'rozp'];
items.forEach(eacher);
SpreadsheetApp.getActive().toast('DONE');
} catch(err){
throw err;
}
}
function action(ss, name, statusIn) {
var senr = ss.getSheetByName(name).getRange("B2").getValue();
var rasar = senr.length;
var bar_rr = ss.getSheetByName(name).getRange("B5").getValue();
var rer = bar_rr.length;
var bar_r1r = ss.getSheetByName(name).getRange("F5").getValue();
var re1r = bar_r1r.length;
var bar_r2r = ss.getSheetByName(name).getRange("J5").getValue();
var re2r = bar_r2r.length;
var bar_r3r = ss.getSheetByName(name).getRange("N5").getValue();
var re3r = bar_r3r.length;
if (rer > rasar) {
ss.getSheetByName(name).getRange("B2").setValue(statusIn);
}
if (re1r > rasar) {
ss.getSheetByName(name).getRange("B2").setValue(statusIn);
}
if (re2r > rasar) {
ss.getSheetByName(name).getRange("B2").setValue(statusIn);
}
if (re3r > rasar) {
ss.getSheetByName(name).getRange("B2").setValue(statusIn);
}
}
Теперь можно контролировать список имен листов. Например, var items = ['Sheet1', 'Sheet2', 'Sheet3', 'rozp'];
и обратиться к логике функции action
.
Если я правильно понял вопрос, то ваш скрипт надо просто ограничить выполнением на активном листе. У вас первая группа команд как раз обрабатывает активный лист, а после комментария
// Следующий лист
Вы зачем-то пишете туже самую обработку, но уже перейдя в скрипте на другой лист. Далее:
var ss = SpreadsheetApp.getActiveSpreadsheet()
var sen = ss.getSheetByName(Sheet1).getRange("B2").getValue();
Вы уже в ss "перешли" на активный лист, а потом снова обращаетесь по имени. Соответственно при разных именах листов - нужно подставлять свои имена. Попробуйте во всех следующих командах обращаться к нему, без имени, например:
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sen = ss.getRange("B2").getValue();
У вас 4 проверки, но результат записывается в одну и ту же ячейку. Все это можно переписать как:
if ((re > rasa) || (re2 > rasa) || (re1 > rasa) || (re3 > rasa) {
ss.getRange("B2").setValue(statusIn);
}
Тогда весь ваш код, если не ошибаюсь, должен выглядеть вот так:
function onEdit(е) {
var statusIn = "REQUEST IN PROCESS";
var ss = SpreadsheetApp.getActiveSpreadsheet()
var sen = ss.getRange("B2").getValue();
var rasa = sen.length;
var bar_r1 = ss.getRange("F5").getValue();
var re1 = bar_r1.length;
var bar_r = ss.getRange("B5").getValue();
var re = bar_r.length;
var bar_r2 = ss.getRange("J5").getValue();
var re2 = bar_r2.length;
var bar_r3 = ss.getRange("N5").getValue();
var re3 = bar_r3.length;
if ((re > rasa) || (re2 > rasa) || (re1 > rasa) || (re3 > rasa) {
ss.getRange("B2").setValue(statusIn);
}
}
И тогда на каком листе нажмете - на том и сработает
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Виртуальный выделенный сервер (VDS) становится отличным выбором
У меня есть JS код, где написан Ajax-запрос к серверу:
уважаемые коллегиЯ только недавно начал осваивать js и jquery, и в процессе написания одного скрипта для расчётчика возникла проблема
Помогите пожалуйста, понят что я делаю не такВсё время получаю 'Login failed'
Всем привет, есть скрипт, написанный на JS, который создает заявку в БД, заполняя определенные параметры, в том числе и дата в формате DDMM