97 подписчиков
Копируем таблицу от имени владельца, скрипт
Друзья, задачка из недавней практики - есть Таблица, в ней есть владелец, как сделать копию этой Таблицы, как будто бы ее сделал владелец, но чтобы это мог сделать любой сотрудник.
Зачем это нужно? Чтобы сохранить все защиты диапазонов, которые есть в Таблице, они должны быть также от имени владельца. А также, чтобы Таблица лежала на Google Диске владельца.
--
Как все работает:
1) Скопировали нашу Таблицу
2) Далее владелец Таблицы, которую мы будем копировать должен зайти в редактор скриптов и поставить скрипт on() на триггер по редактированию Таблицы
(триггеры > добавление нового триггера > выбираем функцию on() и выбираем "при редактировании"
2) Далее "сотрудники" заполняют лист (ссылка на Таблицу, кого добавим как редакторов в копию и новое имя Таблицы)
3) Далее кто угодно активирует чекбокс и происходит магия - триггер запускает скрипт от имени того, кто поставил триггер и в ячейках ниже вы увидите ссылку на скопированную Таблицу и дату и время копирования
И отдельно код:
function on(e) {
const sheet = e.source.getActiveSheet();
const range = e.range;
if (sheet.getName() == 'настройки' && range.getA1Notation() == 'B4' && e.value == 'TRUE') {
copy();
};
};
function copy() {
const ss = SpreadsheetApp.getActive();
const settings = ss.getRange("настройки!b1:b3").getValues().flat();
var [originalUrl, addEmails, name] = settings;
if (!originalUrl) return;
var newUrl = '';
try {
const or = SpreadsheetApp.openByUrl(originalUrl);
newUrl = or.copy(name || 'копия, ' + or.getName());
if (addEmails) newUrl.addEditors(addEmails.split(',').map(f => f.trim()));
newUrl = newUrl.getUrl();
} catch (e) {
newUrl = e.message;
};
ss.getRange("настройки!b5:c5")
.setValues([[newUrl, new Date()]]);
};
1 минута
12 июля