Форум программистов, компьютерный форум, киберфорум
JavaScript: API
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
1 / 1 / 0
Регистрация: 25.08.2019
Сообщений: 3
1

Как ускорить работу скрипта в таблицах Google?

07.01.2023, 15:35. Показов 868. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть таблица, в которой много листов. Часть ячеек заполнена значениями, часть — формулами. Требуется заблокировать ячейки с формулами от изменений. Они должны быть доступны для изменения только ограниченному числу пользователей. Мне удалось написать этот скрипт, но он работает не быстро. Есть ли способы его ускорить?

Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
function myFunction2() {
const sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();
 
for(const sheeto of sheets) { //проводим перебор всех листов
 
 var ss1 = sheeto.getName();
 
 var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(ss1);
 var protections = ss.getProtections(SpreadsheetApp.ProtectionType.RANGE); 
 for (var i = 0; i < protections.length; i++) { //удаляем имеющиеся блокировки при наличии
   var protection = protections[i];
   if (protection.canEdit()) {
     protection.remove();
   }
 }
 var arr2 = ss.getDataRange().getFormulas();
 var numRows = arr2.length-1;
 var numCols = arr2[0].length-1;
 for (var i = 0; i <= numCols; ++i) {
   for (var y = 0; y <= numRows; ++y) {
     if (arr2[y][i]!="") { //блокируем все с формулами
       var range = ss.getRange(y+1,i+1);
       var protection = range.protect().setDescription('автозащита');
       var me = Session.getEffectiveUser();
       protection.addEditor(me);
       
       protection.addEditor('пользователь1');
       protection.addEditor('пользователь2');
       protection.addEditor('пользователь3');
       protection.removeEditors(protection.getEditors());
       if (protection.canDomainEdit()) {
         protection.setDomainEdit(false);
 
       }
     }
   }
 }
}
}
Пыталась воспользоваться именованными диапазонами или назначать диапазоны блокировки напрямую в массиве protections, но в этом случае мой код выдавал ошибки и не работал полноценно.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.01.2023, 15:35
Ответы с готовыми решениями:

Как ускорить работу скрипта по перебору, комбинации сумм
Ребята, добрый день! Есть такая проблема не могу решить. Дано, файл Excel c 10 000...

ускорить работу скрипта
Друзья - php скрипт выполняется более 400 секунд! Подскажите что можно подправить - что бы...

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

Как ускорить быстродействие скрипта [многопоточность]
Всем привет. задумал написать некий демон на perl. Его задача: в бесконечном цикле выбирать записи...

1
1 / 1 / 0
Регистрация: 25.08.2019
Сообщений: 3
08.01.2023, 14:29  [ТС] 2
в общем решила сменить подход. Блокирую не отдельно диапазоны, а весь лист. Ячейки без формул, которые должны быть доступны к изменениям, сохраняю в массив. И этот массив передаю в блокировку листа в качестве диапазонов-исключений. При таком подходе получается гораздо быстрее.

Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
function myFunction2() {
const sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();
  
for(const sheeto of sheets) {
  
  var ss1 = sheeto.getName();
  if  (ss1!="Лист1"  ) {
  
  var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(ss1);
  
 
  var arr2 = ss.getDataRange().getFormulas();
  
 
  var numRows = arr2.length-1;
  var numCols = arr2[0].length-1;
 
var Range1 = new Array(0);
var Range2 = new Array(0);
var Range3 = new Array(1);
vyh: {
  for (var i = 3; i <= numRows; ++i) {
    for (var y = 3; y <= numCols; ++y) {
      if (arr2[i][y]!="") {
        
        
       
 
      }
      else{
        yy=y+1
        ii=i+1
        Range1.length=Range1.length+1
        Range1[Range1.length-1]=yy 
        Range2.length=Range2.length+1
        Range2[Range2.length-1]=ii 
 
      }  
    }
  }
 
}
 
Range3[0]=col2A1(Range1[0]) + Range2[0]
ii=1
f=0
for (var i = 1; i <= Range1.length-1; ++i){
 
  if (Range2[i]==Range2[i-1] && Range1[i-1]==Range1[i]-1) {
    if (f==0) {
    Range3[ii-1] = Range3[ii-1] + ":" + col2A1(Range1[i]) + Range2[i]
    f=1
    }
    else{
      Range3[ii-1]=Range3[ii-1].slice(0, Range3[ii-1].indexOf(":")) + ":" + col2A1(Range1[i]) + Range2[i]
      
    }
  }
  else {
    Range3[ii]=col2A1(Range1[i]) + Range2[i]
    ii=ii+1
    f=0
 
  }
 
 }
 
 
 
var protection = ss.protect().setDescription('автозащита листа');
 
var me = Session.getEffectiveUser();
protection.addEditor(me);
 
protection.removeEditors(protection.getEditors());
if (protection.canDomainEdit()) {
  protection.setDomainEdit(false);
}
1
08.01.2023, 14:29
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.01.2023, 14:29
Помогаю со студенческими работами здесь

Как ускорить работу IJ?
Ребят, всем добрый день, я читал, что ява компилируется дольше, чем си, но у меня как-то долго......

Как ускорить работу?
Прога ещё не доработана, сейчас интересует именно графический режим, когда нажимается клавиша 1-4...

Как ускорить работу
Всем доброго дня! У меня существует таблица на 50 000 строк СУБД Mysql, в одной части таблицы 200...

Как ускорить работу сокетов?
Добрый день, Руководитель дал задание на практику написать приложение на C/C++ -...

Как ускорить работу цикла?
Всем привет. Итак, мне нужно было решить задачу на подобии вот этой...

Как ускорить работу программы?
Здравствуйте. Имеется задача определения пароля, которым было зашифровано некоторое сообщение....

Как ускорить работу TreeView?
При большом количестве элементов (5 тыс.) поиск по дереву, например, по значению свойства узла...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru