Как скопировать защищенную Google таблицу

Обновлено 09.09.2022

Как скопировать защищенную Google таблицу

Добрый день! Уважаемые читатели и гости IT блога Pyatilistnik.org. В прошлый раз мы успешно диагностировали и нашли причину синего экрана Windows с кодом "whea uncorrectable error". Идем далее и сегодня очень долгожданная статья, так как меня о ней уже просили десятки людей, кто столкнулся с задачей получения данных из Google таблиц. Задача у нас с вами такая, нужно скачать или скопировать файл Google таблиц, который ограничен на редактирование, изменение и скачивание.

💡Как выгрузить данные из Google таблицы, когда запрещено скачивать, печатать или копировать

Данная статья уже четвертая из данного цикла, о том как сохранять подобного рода документы и видео себе локально на компьютер, посмотрите может вы что-то до этого пропустили😊

И так предположим, что с вами кто-то поделился каким-то файлом в Google таблицах, в моем примере пусть это будет копия моего файла с диска, на котором я для данной статьи включил опцию "Разрешить читателям и комментаторам документа скачивать, распечатывать и копировать его".

Разрешить читателям и комментаторам документа скачивать, распечатывать и копировать его

В результате, когда человек открывает данный файл по предоставленной ему ссылке, и попытается просто скопировать содержимое, то увидит сверху предупреждение, что:

Этот файл запрещено скачивать, печатать или копировать

Этот файл запрещено скачивать, печатать или копировать

Так же если вы откроете меню "Файл - Скачать", то обнаружите, что данные пункты меню просто не активны и вы не сможете сделать себе копию данной таблицы, выгрузить ее в Excel формат или просто скачать.

Ограниченный документ в Google Таблицах

Что же делать в подобной ситуации, можно попробовать один метод. Показывать буду на примере Google Chrome, но все действия будут актуальны и для Edge и других браузеров на базе Cromium.

  • 1️⃣Нажмите одновременно CTRL+SHIFT+B, это активирует показ панели закладок

Активация панели закладок

  • 2️⃣Далее откройте в адресной строке chrome://bookmarks/ и создайте новую закладку

Новая закладка в Google Chrome

  • 3️⃣Задаем нужное для вас имя закладки, а в URL вставляем код, который вы можете скачать по ссылке. Там будет Zip-архив с текстовым файлом внутри. Кто не знает, что делать с архивом, посмотрите как его разархивировать.

Добавление новой закладки в браузере

Скачать файл с кодом - https://cloud.mail.ru/public/guti/6xQQ81u76

  • 4️⃣Остается перенести новую закладку в панель закладок. Для этого либо просто из списка зажмите и перенесите на панель новую закладку, или если используете боковую панель, то можно это сделать так же с ее помощью.

Перенос закладки в Chrome

  • 5️⃣Теперь откройте вкладку с вашим документом в Google Sheets и нажмите на созданную ранее закладку. В результате у вас в правом нижнем углу откроется дополнительное окно, в котором нужно скопировать ссылку из поля "Copyable Google Sheet"

Скачивание защищенного документа в Google таблицах

  • 6️⃣В результате у вас откроется данный файл, но уже с возможностью копирования текста, из минусов могут быть недоступны формулы.

Копирование ограниченного файла в Google Sheet

  • 7️⃣Еще как вариант можете в ссылке оригинале, заменить edit#gid= на preview#gid=.

Скачать таблицу из Google Sheet

Использование расширения Enable Spreadsheet Copy

Вторым методом я хочу показать простое расширение "Enable Spreadsheet Copy". Данный метод может показаться слегка проще для пользователя, так как тут просто нужно нажать одну кнопку скачать, но может получиться такая ситуация, что Google просто залочит данное расширение, как в случае с Adblocker. Поэтому я вам советую его сохранить себе локально, как это делать я так же показывал. Из минусов, данное расширение будет кушать ресурсы в отличие от закладки.

https://chrome.google.com/webstore/detail/enable-spreadsheet-copy/kpejegeplfmfcdaelkmmjlnijkejigpg

Найдите в магазине Chrome расширение Enable Spreadsheet Copy и просто нажмите кнопку "Установить".

Установка Enable Spreadsheet Copy

Далее откройте вашу защищенную от изменений и копирования Google таблицу и нажмите на значок Enable Spreadsheet Copy, в результате он так же откроет превью версию данного документа, где вы сможете произвести копирование.

Использование Enable Spreadsheet Copy

Копирование Google таблицы с помощью скрипта на Apps Script

Как вариант вы можете попробовать воспользоваться скриптом запущенном на вашем Google диске. Перейдите на диск Google, нажмите "Создать - Еще -  Google Apps Script".

Google Apps Script

Замените любой существующий код кодом отсюда. Вам также нужно будет скопировать идентификатор электронной таблицы и вставить его в код.

function Main() {
var template = DriveApp.getFileById('YOUR_SPREADSHEET_ID'); //шаблон электронной таблицы
var destination = DriveApp.getFolderById('COPY_DESTINATION_FOLDER_ID/'); //каталог, в который нужно скопировать файл
var curDate = Utilities.formatDate(new Date(), Session.getScriptTimeZone(), "yyyy-MM-dd");
var copyName = template.getName() + ' copy ' + curDate; //имя файла, которое следует применить к новой копии

copyTemplate(template, copyName, destination);
}

/**
* Копирование Гугл таблицы со всеми разрешениями
*
* @param {File} template - Шаблон электронной таблицы
* @param {string} [copyName] - имя файла, которое следует применить к новой копии (необязательно)
* @param {Folder} [destination] - каталог для копирования файла (необязательно)
* @param {boolean} [allowDuplicates] - разрешить копирование, если файл с таким именем уже существует (необязательно)
* @throws ошибку при возникновении ошибки ¯\_(ツ)_/¯
* @example
* //создает копию шаблона с тем же именем внутри корневого каталога, дубликаты игнорируются
* var myTemplate = DriveApp.getFileById('MY_TEMPLATE_ID');
* copyTemplate(myTemplate);
* @example
* //создает копию шаблона с тем же именем внутри заданного каталога, если нет дубликатов
* var myTemplate = DriveApp.getFileById('MY_TEMPLATE_ID');
* var copyDestination = DriveApp.getFolderById('DESTINATION_DIRECTORY_ID');
* copyTemplate(myTemplate, null, copyDestination, false);
*/
function copyTemplate(template, copyName, destination, allowDuplicates) {
var newSheet, templateSheet, fileIterator;

//устанавливаем значения по умолчанию
copyName = copyName || template.getName();
destination = destination || DriveApp.getRootFolder();
allowDuplicates = allowDuplicates === false ? false : true;

//если дубликаты запрещены и файл с таким именем уже существует, останавливаем выполнение
if(!allowDuplicates) {
fileIterator = destination.getFilesByName(copyName);

while (fileIterator.hasNext()) {
if(fileIterator.next().getMimeType() == MimeType.GOOGLE_SHEETS) {
throw new Error("File already exists");
}
}
}

templateSheet = SpreadsheetApp.open(template);
newSheet = SpreadsheetApp.open(template.makeCopy(copyName, destination));

//copy protections from the template to the new spreadsheet
copyProtections(templateSheet, newSheet);
}

/**
* Копирует защиту из источника в цель
*
* @param {Spreadsheet} origin - Origin spreadsheet
* @param {Spreadsheet} target - Target spreadsheet
*/
function copyProtections(origin, target) {
var sheets = origin.getSheets();

for(var i = 0; i < sheets.length; i++) {
var newSheet = target.getSheetByName(sheets[i].getName());
var sheetProtection = sheets[i].getProtections(SpreadsheetApp.ProtectionType.SHEET)[0];
var newSheetProtection = newSheet.getProtections(SpreadsheetApp.ProtectionType.SHEET)[0];
var rangeProtections = sheets[i].getProtections(SpreadsheetApp.ProtectionType.RANGE);
var newRangeProtections = newSheet.getProtections(SpreadsheetApp.ProtectionType.RANGE);

//Воссоздаем защиту листа с нуля
if(sheetProtection) {
var unprotected = sheetProtection.getUnprotectedRanges();
var newUnprotected = [];
for (var j = 0; j < unprotected.length; j++) {
newUnprotected.push(newSheet.getRange(unprotected[j].getA1Notation()));
}
cloneProperties(sheetProtection, newSheetProtection);
newSheetProtection.setUnprotectedRanges(newUnprotected);
}

//Удалить защиту диапазона в новом листе
for(var j = 0; j < newRangeProtections.length; j++) {
newRangeProtections[j].remove();
}

//Recereate range protections from scratch
for (var j = 0; j < rangeProtections.length; j++) {
var protection = rangeProtections[j];
var newProtection;

if(protection.getRangeName()) {
//if protection is set to the named range
newProtection = target.getRangeByName(protection.getRangeName()).protect();
newProtection.setRangeName(protection.getRangeName());
} else {
newProtection = newSheet.getRange(protection.getRange().getA1Notation()).protect();
}
cloneProperties(protection, newProtection);
}//end of ranges
}//end of sheets
}

/**
* Копирует основные свойства объекта защиты
*
* @param {Protection} origin - Protection object of the source
* @param {Protection} target - Protection object of the target
*/
function cloneProperties(origin, target) {
target.setDescription(origin.getDescription());
target.setWarningOnly(origin.isWarningOnly());

if (!origin.isWarningOnly()) {
var editors = origin.getEditors();
var oldEditors = target.getEditors();

for(var i = 0; i < oldEditors.length; i++) {
target.removeEditor(oldEditors[i]);
}
for(var i = 0; i < editors.length; i++) {
target.addEditor(editors[i]);
}
if (origin.canDomainEdit()) {
target.setDomainEdit(true);
}
}
}

В результате у вас в корне Google диска будет создана полная копия нужной вам таблицы, со всеми разрешениями, которые вы сможете редактировать. Где искать SPREADSHEET_ID, по сути в ссылке, например в моем примере SPREADSHEET_ID это 1h8gRqUZFtNJ2YKX6cAtdcz_iWTiFoc0kJ3S4KCLJkio.

Как найти SPREADSHEET_ID

На этом у меня все. Мы с вами попытались найти вместе метод, помогающий нам сохранить ограниченный документ из Google Таблиц. С вами был Иван Семин, автор и создатель IT портала Pyatilistnik.org.

Автор - Сёмин Иван

One Response to Как скопировать защищенную Google таблицу

  1. Horman:

    в последнем варианте
    при выполнении пишет
    Ошибка Exception: Service Spreadsheets failed while accessing document with id
    copyTemplate код.gs:47
    Main код.gs:7

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *