<?xml version="1.0" encoding="utf-8"?> 
<rss version="2.0"
  xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
  xmlns:atom="http://www.w3.org/2005/Atom">

<channel>

<title>Заметки — Игорь К.: заметки с тегом скрипт</title>
<link>https://blog.fossko.ru/tags/skript/</link>
<description>Блог Игоря К. о маркетинге, аналитике, фотографии и жизни...</description>
<author></author>
<language>ru</language>
<generator>Aegea 11.4 (v4171)</generator>

<itunes:subtitle>Блог Игоря К. о маркетинге, аналитике, фотографии и жизни...</itunes:subtitle>
<itunes:image href="" />
<itunes:explicit></itunes:explicit>

<item>
<title>Как скачать видео с boosty</title>
<guid isPermaLink="false">575</guid>
<link>https://blog.fossko.ru/all/kak-skachat-video-s-boosty/</link>
<pubDate>Thu, 01 Jan 2026 18:02:41 +0300</pubDate>
<author></author>
<comments>https://blog.fossko.ru/all/kak-skachat-video-s-boosty/</comments>
<description>
&lt;p&gt;На гитхабе, пользователь tsvtt &lt;a href="https://gist.github.com/tsvtt/65f335fde4f873b7d2702e7294334194"&gt;опубликовал как скачать видео с бусти&lt;/a&gt;.&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;Открыть страницу с видео, видео должно быть видно на странице, можно запустить, но это не обязательно.&lt;/li&gt;
&lt;/ol&gt;
&lt;ol start="2"&gt;
&lt;li&gt;Открыть средства разработчика в браузере&lt;br /&gt;
для открытия нажмите&lt;br /&gt;
Ctrl+Shift+C&lt;/li&gt;
&lt;/ol&gt;
&lt;ol start="3"&gt;
&lt;li&gt;Открыть вкладку с консолью — Console&lt;/li&gt;
&lt;/ol&gt;
&lt;ol start="4"&gt;
&lt;li&gt;Выполнить:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;document.querySelector(&amp;#039;vk-video-player&amp;#039;).store.actions.internal.downloadVideo()&lt;/code&gt;&lt;/pre&gt;&lt;ol start="5"&gt;
&lt;li&gt;Видеоролик скачивается в максимальном качестве&lt;/li&gt;
&lt;/ol&gt;
</description>
</item>

<item>
<title>Google скрипт просит права сразу на все документы</title>
<guid isPermaLink="false">543</guid>
<link>https://blog.fossko.ru/all/google-skript-prosit-prava-srazu-na-vse-dokumenty/</link>
<pubDate>Mon, 18 Dec 2023 11:33:08 +0300</pubDate>
<author></author>
<comments>https://blog.fossko.ru/all/google-skript-prosit-prava-srazu-na-vse-dokumenty/</comments>
<description>
&lt;p&gt;Когда Google Apps Script просит доступ ко всем документам на гугл диске.&lt;br /&gt;
Чтобы избежать проблем с доступом, добавьте в шапку скриптов код:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;/**
 * @OnlyCurrentDoc
 */&lt;/code&gt;&lt;/pre&gt;&lt;div class="e2-text-picture"&gt;
&lt;img src="https://blog.fossko.ru/pictures/image-18.png" width="990" height="389" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;Код вставляется со всеми слешами и звездочками. &lt;a href="https://developers.google.com/apps-script/guides/services/authorization?hl=ru#manual_authorization_scopes_forand"&gt;Справка гугл документов&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
</description>
</item>

<item>
<title>Добавляем пользователя к разрешениям на папку</title>
<guid isPermaLink="false">532</guid>
<link>https://blog.fossko.ru/all/dobavlyaem-polzovatelya-k-razresheniyam-na-papku/</link>
<pubDate>Thu, 05 Oct 2023 13:25:29 +0300</pubDate>
<author></author>
<comments>https://blog.fossko.ru/all/dobavlyaem-polzovatelya-k-razresheniyam-na-papku/</comments>
<description>
&lt;p&gt;Скрипт на повершеле, для добавления пользователя к разрешениям на папку&lt;br /&gt;
Это может понадобится если нужно добавить права нового пользователя не убирая остальные права доступа. Например на папку «мои документы» определенного пользователя&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;$path = &amp;quot;e:\system volume information\&amp;quot;
$user = &amp;quot;DOMAIN\Administrator&amp;quot;
$Rights = &amp;quot;FullControl&amp;quot;

$InheritSettings = &amp;quot;Containerinherit, ObjectInherit&amp;quot;
$PropogationSettings = &amp;quot;None&amp;quot;
$RuleType = &amp;quot;Allow&amp;quot;
$acl = Get-Acl $path
$perm = $user, $Rights, $InheritSettings, $PropogationSettings, $RuleType
$rule = New-Object -TypeName System.Security.AccessControl.FileSystemAccessRule -ArgumentList $perm
$acl.SetAccessRule($rule)
$acl | Set-Acl -Path $path&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;a href="https://learn.microsoft.com/ru-ru/previous-versions/ms229747(v=vs.110)?redirectedfrom=MSDN"&gt;Правила передачи ACL&lt;/a&gt;: что такое «Containerinherit, ObjectInherit»&lt;br /&gt;
&lt;a href="https://coolcode.ru/razdacha-prav-na-ntfs-iz-powershell/"&gt;Права доступа&lt;/a&gt;: Read, Write, Modify и FullControl&lt;/p&gt;
</description>
</item>

<item>
<title>Скачиваем видео с ютуба</title>
<guid isPermaLink="false">531</guid>
<link>https://blog.fossko.ru/all/skachivaem-video-s-youtube/</link>
<pubDate>Sat, 30 Sep 2023 23:36:56 +0300</pubDate>
<author></author>
<comments>https://blog.fossko.ru/all/skachivaem-video-s-youtube/</comments>
<description>
&lt;p&gt;&lt;a href="https://github.com/yt-dlp/yt-dlp#release-files"&gt;Yt-dlp&lt;/a&gt; — утилита для скачивания роликов с ютуба, ниже команды которые я использую чаще всего.&lt;/p&gt;
&lt;p&gt;Можно скачивать из других сервисов, например, рутуб.&lt;/p&gt;
&lt;p&gt;Одиночное видео, в имени файла будет ай-ди ролика&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;yt-dlp -f &amp;quot;22/bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best&amp;quot; &amp;quot;https://www.youtube.com/watch?v=NdToAHst3BY&amp;quot;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Одиночное видео&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;yt-dlp -f &amp;quot;22/bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best&amp;quot; &amp;quot;https://www.youtube.com/watch?v=NdToAHst3BY&amp;quot; -o &amp;quot;%(title)s.%(ext)s&amp;quot;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Скачиваем список роликов, ссылки лежать в файле list.txt&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;yt-dlp -f &amp;quot;22/bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best&amp;quot; -a list.txt&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Скачиваем плейлист&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;yt-dlp -f &amp;quot;22/bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best&amp;quot; &amp;quot;https://www.youtube.com/playlist?list=PLpZakfG8U02uo3HQ5dPe52yoUlcOOAssg&amp;quot;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Формат скачивания 720p&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;&amp;quot;22/bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best&amp;quot;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Формат 22 обозначает 720p видео. Дальше если 720p формат недоступен, то будет загружено лучшее доступное видео формата mp4 с лучшим доступным аудио формата m4a. Если ни один из этих форматов недоступен, то будет загружено лучшее доступное видео формата mp4.&lt;/p&gt;
&lt;p&gt;В ВК видео чтобы скачать 720p используем команду&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;yt-dlp -f &amp;quot;bestvideo[height&amp;lt;=720]+bestaudio/best[height&amp;lt;=720]&amp;quot;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;На гитхабе yt-dlp, можно посмотреть &lt;a href="https://github.com/yt-dlp/yt-dlp#usage-and-options"&gt;опции&lt;/a&gt;, &lt;a href="https://github.com/yt-dlp/yt-dlp#output-template-examples"&gt;примеры использования yt-dlp&lt;/a&gt;, &lt;a href="https://github.com/yt-dlp/yt-dlp/blob/master/supportedsites.md"&gt;поддерживаемые сайты для скачивания&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="/all/kak-skachat-potokovoe-video/"&gt;Для скачивания с геткурса, можно использовать плагин Stream Recorder&lt;/a&gt;&lt;/p&gt;
</description>
</item>

<item>
<title>Как скачать защищенный pdf файл с гугл диска?</title>
<guid isPermaLink="false">530</guid>
<link>https://blog.fossko.ru/all/kak-skachat-zaschischenny-pdf-fayl-s-gugl-diska/</link>
<pubDate>Wed, 27 Sep 2023 10:21:27 +0300</pubDate>
<author></author>
<comments>https://blog.fossko.ru/all/kak-skachat-zaschischenny-pdf-fayl-s-gugl-diska/</comments>
<description>
&lt;p&gt;Дурим Шала, &lt;a href="https://gist.github.com/dpaluy/74258794f7930401cc27262e0ea794dd#step-by-step-guide-to-downloading-protected-pdf-from-google-drive"&gt;обновил код по скачиванию защищенного файла с гугл диска&lt;/a&gt;.&lt;br /&gt;
Код работает на сентябрь 2023 года, добавлена проверка политики безопасности, которая выводила ошибку&lt;/p&gt;
&lt;p&gt;Файл скачивается в виде картинок упакованных в ПДФ.&lt;/p&gt;
&lt;h2&gt;Руководство по загрузке защищенного PDF-файла с Google Диска&lt;/h2&gt;
&lt;ol start="1"&gt;
&lt;li&gt;Откройте документ в Документах Google.&lt;/li&gt;
&lt;li&gt;Прокрутите документ до конца, чтобы были видны все страницы.&lt;/li&gt;
&lt;li&gt;Откройте «Инструменты разработчика» для этого на клавиатуре нажмите Ctrl+Shift+C&lt;/li&gt;
&lt;li&gt;Выберите вкладку «Консоль».&lt;/li&gt;
&lt;li&gt;Вставьте код и нажмите Enter.&lt;/li&gt;
&lt;li&gt;ПДФ скачается в виде картинок упакованных в ПДФ.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;let trustedURL;
if (window.trustedTypes &amp;amp;&amp;amp; trustedTypes.createPolicy) {
    const policy = trustedTypes.createPolicy(&amp;#039;myPolicy&amp;#039;, {
        createScriptURL: (input) =&amp;gt; {
            return input;
        }
    });
    trustedURL = policy.createScriptURL(&amp;#039;https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.3.2/jspdf.min.js&amp;#039;);
} else {
    trustedURL = &amp;#039;https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.3.2/jspdf.min.js&amp;#039;;
}

// Load the jsPDF library using the trusted URL.
let jspdf = document.createElement(&amp;quot;script&amp;quot;);
jspdf.onload = function () {
    // Generate a PDF from images with &amp;quot;blob:&amp;quot; sources.
    let pdf = new jsPDF();
    let elements = document.getElementsByTagName(&amp;quot;img&amp;quot;);
    for (let i = 0; i &amp;lt; elements.length; i++) {
        let img = elements[i];
        if (!/^blob:/.test(img.src)) {
            continue;
        }
        let canvasElement = document.createElement(&amp;#039;canvas&amp;#039;);
        let con = canvasElement.getContext(&amp;quot;2d&amp;quot;);
        canvasElement.width = img.width;
        canvasElement.height = img.height;
        con.drawImage(img, 0, 0, img.width, img.height);
        let imgData = canvasElement.toDataURL(&amp;quot;image/jpeg&amp;quot;, 1.0);
        pdf.addImage(imgData, &amp;#039;JPEG&amp;#039;, 0, 0);
        if (i !== elements.length - 1) {
            pdf.addPage();
        }
    }

    // Download the generated PDF.
    pdf.save(&amp;quot;download.pdf&amp;quot;);
};
jspdf.src = trustedURL;
document.body.appendChild(jspdf);&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Если хотите до загрузки изменить имя download.pdf на свое. Измените имя в строке&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;pdf.save(&amp;quot;download.pdf&amp;quot;);&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;В измененном коде происходит проверка наличия поддержки Trusted Types в браузере.&lt;/p&gt;
&lt;p&gt;Trusted Types — механизм безопасности веб-приложений.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://blog.fossko.ru/pictures/kak-skachat-zaschischenny-pdf-fayl-s-gugl-diska.png" width="719" height="63" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;В некоторых браузерах стоит запрет на вставку из буфера обмена в консоль, для активации вставки, наберите в консоли — allow pasting и нажмите энтер&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Присутствует поддержка Trusted Types&lt;/b&gt;, создается политика Trusted Types под названием «myPolicy»  определяющая как создавать безопасные URL. Затем создается доверенный URL для загрузки скрипта jspdf.min.js.&lt;/li&gt;
&lt;li&gt;&lt;b&gt; Отсутствует поддержка Trusted Types&lt;/b&gt;, используется стандартный URL для загрузки скрипта.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Вариант скрипта с фиксированным A4 в портретной ориентации (Portrait)&lt;/h2&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;let trustedURL;
if (window.trustedTypes &amp;amp;&amp;amp; trustedTypes.createPolicy) {
    const policy = trustedTypes.createPolicy(&amp;#039;myPolicy&amp;#039;, {
        createScriptURL: (input) =&amp;gt; input
    });
    trustedURL = policy.createScriptURL(&amp;#039;https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.3.2/jspdf.min.js&amp;#039;);
} else {
    trustedURL = &amp;#039;https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.3.2/jspdf.min.js&amp;#039;;
}

let jspdf = document.createElement(&amp;quot;script&amp;quot;);
jspdf.onload = function () {
    // PDF фиксированного размера A4
    let pdf = new jsPDF(&amp;#039;p&amp;#039;, &amp;#039;mm&amp;#039;, &amp;#039;a4&amp;#039;);

    let elements = document.getElementsByTagName(&amp;quot;img&amp;quot;);

    for (let i = 0; i &amp;lt; elements.length; i++) {
        let img = elements[i];
        if (!/^blob:/.test(img.src)) continue;

        // Рисуем изображение в canvas
        let canvasElement = document.createElement(&amp;#039;canvas&amp;#039;);
        let con = canvasElement.getContext(&amp;quot;2d&amp;quot;);
        canvasElement.width = img.naturalWidth;
        canvasElement.height = img.naturalHeight;
        con.drawImage(img, 0, 0);

        // Получение JPEG из canvas
        let imgData = canvasElement.toDataURL(&amp;quot;image/jpeg&amp;quot;, 1.0);

        // Вставляем картинку на лист A4 по всей странице
        pdf.addImage(imgData, &amp;#039;JPEG&amp;#039;, 0, 0, 210, 297);

        if (i !== elements.length - 1) {
            pdf.addPage();
        }
    }

    pdf.save(&amp;quot;download.pdf&amp;quot;);
};

jspdf.src = trustedURL;
document.body.appendChild(jspdf);&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;Вариант скрипта с фиксированным A4 в альбомной ориентации (Landscape)&lt;/h2&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;let trustedURL;
if (window.trustedTypes &amp;amp;&amp;amp; trustedTypes.createPolicy) {
    const policy = trustedTypes.createPolicy(&amp;#039;myPolicy&amp;#039;, {
        createScriptURL: (input) =&amp;gt; input
    });
    trustedURL = policy.createScriptURL(&amp;#039;https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.3.2/jspdf.min.js&amp;#039;);
} else {
    trustedURL = &amp;#039;https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.3.2/jspdf.min.js&amp;#039;;
}

let jspdf = document.createElement(&amp;quot;script&amp;quot;);
jspdf.onload = function () {

    // PDF A4 landscape: 297mm × 210mm
    let pdf = new jsPDF(&amp;#039;l&amp;#039;, &amp;#039;mm&amp;#039;, &amp;#039;a4&amp;#039;);

    let elements = document.getElementsByTagName(&amp;quot;img&amp;quot;);

    for (let i = 0; i &amp;lt; elements.length; i++) {
        let img = elements[i];
        if (!/^blob:/.test(img.src)) continue;

        // Создаем canvas по натуральным размерам изображения
        let canvasElement = document.createElement(&amp;#039;canvas&amp;#039;);
        let con = canvasElement.getContext(&amp;quot;2d&amp;quot;);
        canvasElement.width = img.naturalWidth;
        canvasElement.height = img.naturalHeight;
        con.drawImage(img, 0, 0);

        // Конвертируем в JPEG
        let imgData = canvasElement.toDataURL(&amp;quot;image/jpeg&amp;quot;, 1.0);

        // Вставляем изображение на всю страницу A4 landscape
        pdf.addImage(imgData, &amp;#039;JPEG&amp;#039;, 0, 0, 297, 210);

        if (i !== elements.length - 1) {
            pdf.addPage();
        }
    }

    pdf.save(&amp;quot;download.pdf&amp;quot;);
};

jspdf.src = trustedURL;
document.body.appendChild(jspdf);&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;Пакетное скачивание защищенных пдф файлов&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/fossko/gdrive_pdf_saver"&gt;gdrive_pdf_saver&lt;/a&gt; — проект на гитхабе, нужен питон.&lt;/p&gt;
</description>
</item>

<item>
<title>Типограф в гугл документах</title>
<guid isPermaLink="false">472</guid>
<link>https://blog.fossko.ru/all/tipograf-v-gugl-dokumentah/</link>
<pubDate>Sun, 29 Jan 2023 15:46:28 +0300</pubDate>
<author></author>
<comments>https://blog.fossko.ru/all/tipograf-v-gugl-dokumentah/</comments>
<description>
&lt;p&gt;Когда используешь гугл документы для набора текстов для печати, не хватает встроенного типографа. Типограф нужен для правильного проставления неразрывного пробела, знака тире, замены кавычек на правильные.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/glebkema/google-docs-typograf"&gt;Скрипт от Глеба Керамского&lt;/a&gt; написан на google apps script и легко адаптируется&lt;/p&gt;
&lt;h2&gt;Скрипт работает только в текущем документе&lt;/h2&gt;
&lt;p&gt;В оригинале скрипт можно запускать в определенном документе, для этого:&lt;br /&gt;
открываем наш гугл документ и переходим в Apps Script&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://blog.fossko.ru/pictures/tipograf-v-gugl-dokumentah.png" width="744" height="260" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;Меню — расширения — Apps Script&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Копируем код из скрипта Глеба и вставляем в наш скрипт&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://blog.fossko.ru/pictures/tipograf-v-gugl-dokumentah-1.png" width="1194" height="866" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;У Глеба на гитхабе код лежит в файле &lt;a href="https://github.com/glebkema/google-docs-typograf/blob/master/Code.gs"&gt;Code.gs&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Можно остановиться на этом, но лучше в только что созданный скрипт, добавить следующее&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;/**
 * @OnlyCurrentDoc
 */&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Эта строчка позволит ограничить запуск скрипта текущим документом&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://blog.fossko.ru/pictures/tipograf-v-gugl-dokumentah-2.png" width="1078" height="527" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;Итоговый скрипт с нашим дополнением&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Дальше мы сохраняем и переходим в гугл документ.&lt;/p&gt;
&lt;p&gt;Для работы скрипта нужно перегрузить страницу, нажимаем CTRL+F5&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://blog.fossko.ru/pictures/tipograf-v-gugl-dokumentah-3.png" width="1278" height="545" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;После перезагрузки страницы в этом документе появился пункт меню — typograf, при нажатии на него текст будет отипографирован.&lt;/div&gt;
&lt;/div&gt;
&lt;div class="e2-text-picture"&gt;
&lt;div class="fotorama" data-width="729" data-ratio="1.744019138756"&gt;
&lt;img src="https://blog.fossko.ru/pictures/tipograf-v-gugl-dokumentah-4.png" width="729" height="418" alt="" /&gt;
&lt;img src="https://blog.fossko.ru/pictures/tipograf-v-gugl-dokumentah-5.png" width="767" height="649" alt="" /&gt;
&lt;/div&gt;
&lt;div class="e2-text-caption"&gt;Если вы запускаете скрипт первый раз, будет предложено проверить разрешение скрипта. После разрешение текст будет отипографирован.&lt;/div&gt;
&lt;/div&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://blog.fossko.ru/pictures/tipograf-v-gugl-dokumentah-6.png" width="713" height="412" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;Пример до: висячие предлоги и дефис вместо тире.&lt;/div&gt;
&lt;/div&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://blog.fossko.ru/pictures/tipograf-v-gugl-dokumentah-7.png" width="726" height="396" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;После применения скрипта, висячие пробелы пропали и дефис поменялся на длинное тире. На самом деле тут после всех предлогов стали неразрывные пробелы.&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Для применения скрипта нужно в каждом документе проделать следующие шаги:&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;Зайти в гитхаб и скопировать скрипт.&lt;/li&gt;
&lt;li&gt;Добавить скрипт в google apps script.&lt;/li&gt;
&lt;li&gt;Перезагрузить документ.&lt;/li&gt;
&lt;li&gt;Выполнить скрипт.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Скрипт работает для любого документа к которому есть доступ.&lt;/h2&gt;
&lt;p&gt;Можно сделать один скрипт на все документы к которым есть доступ.&lt;br /&gt;
Для этого нужно сделать google apps script который не подключен к конкретному документу, для этого зайдите на гугл диск в любую папку, например «Скрипты», нажмите правой клавишей пункт Еще — google apps script&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://blog.fossko.ru/pictures/tipograf-v-gugl-dokumentah-8.png" width="768" height="501" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;При таком создании, скрипт будет работать отдельно от документа&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Рекомендую дать скрипту нормально название, например «Типограф», так будет проще искать по поиску на гугл диске.&lt;/p&gt;
&lt;p&gt;Копируем в наш скрипт &lt;a href="https://github.com/glebkema/google-docs-typograf/blob/master/Code.gs"&gt;код из гитхаба Глеба.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Теперь нам нужно модифицировать скрипт&lt;/p&gt;
&lt;p&gt;В функции typograf() комментируем строчку с выбором текущего файла, ставит две косые&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;//var body = DocumentApp.getActiveDocument().getBody();&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Создаем новую переменную в которую будем вставлять урл нашего документа&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;var body = DocumentApp.openByUrl(&amp;#039;https://docs.google.com/document/d/XXXXXXX&amp;#039;);&lt;/code&gt;&lt;/pre&gt;&lt;div class="e2-text-picture"&gt;
&lt;img src="https://blog.fossko.ru/pictures/tipograf-v-gugl-dokumentah-9.png" width="1303" height="613" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;Наши изменения скрипта&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Сохраняем.&lt;/p&gt;
&lt;p&gt;Теперь нам нужно подправить какой-то документ:&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;Копируем его полный адрес&lt;/li&gt;
&lt;li&gt;Вставляем в переменную body — не забываем что адрес вставляется в одинарной в кавычках, у меня одинарная кавычка.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;var body = DocumentApp.openByUrl(&amp;#039;URL_DOC&amp;#039;);&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Сохраняем.&lt;/p&gt;
&lt;p&gt;Осталось запустить, для этого в скрипте выбираем Типограф и кнопку «выполнить»&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://blog.fossko.ru/pictures/tipograf-v-gugl-dokumentah-10.png" width="860" height="270" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;Если у вас не выбран типограф — нажимаем стрелочку вниз и выбираем.&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Скрипт попросит авторизацию на возможное изменения всех документов, даем ему это разрешения.&lt;/p&gt;
&lt;p&gt;После запуска скрипт запустится и оттипографирует ваш документ.&lt;/p&gt;
&lt;p&gt;Если нужно, можно вставить ссылку на другой документ, а затем еще один.&lt;/p&gt;
</description>
</item>

<item>
<title>Простое резервное копирование через повершел</title>
<guid isPermaLink="false">462</guid>
<link>https://blog.fossko.ru/all/prostoe-rezervnoe-kopirovanie-cherez-powershell/</link>
<pubDate>Thu, 07 Apr 2022 15:24:38 +0300</pubDate>
<author></author>
<comments>https://blog.fossko.ru/all/prostoe-rezervnoe-kopirovanie-cherez-powershell/</comments>
<description>
&lt;p&gt;Потребовалось на повершеле написать скрипт резервного копирования файлов которые сделаны сегодня и вчера.&lt;/p&gt;
&lt;p&gt;Для копирования есть функция —  &lt;a href="https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/copy-item?view=powershell-7.2"&gt;Copy-Item&lt;/a&gt;&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;Copy-Item &amp;quot;Что-то&amp;quot; -Destination &amp;quot;Куда-то&amp;quot; -force&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Вместо «куда-то» можно использовать переменную с папкой, например:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;$path_new = &amp;quot;F:\backup\&amp;quot; #папка в которую копируем
$path = &amp;quot;\\FileServer\backup\&amp;quot; # папка из которой копируют, лежит на файл сервере&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;тогда скрипт будет как-то так:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;Copy-Item &amp;quot;Что-то&amp;quot; -Destination $path_new  -force #Копируем что-то в папку $path_new&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;например, всё содержимое папки $path в папку $path_new&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;Copy-Item $path -Destination $path_new  -force #Копируем всё содержимое папки $path в папку $path_new&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;«Что-то» это файлы в определенной папке, созданные вчера. То есть файлы у которых дата создания отличается от сегодня на один день.&lt;br /&gt;
Определим дату с которой мы будем считать файлы&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;$date = (Get-Date).AddDays(-1) #определение в переменную даты минус сколько-то от текущей, в наем случае минус 1&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Теперь получим список всех файлов, в папке дата и время которых больше вчерашней даты.&lt;br /&gt;
есть особенность, что до версии powershell3, нужно писать так&lt;/p&gt;
&lt;/code&gt;&lt;p&gt;$file_copy = Get-ChildItem -Path $path | Where-Object {$_.CreationTime -gT $date2} #определяем все файлы которые нужно скопировать&lt;/p&gt;
&lt;/code&gt;&lt;p&gt;После версии powershell3, нужно писать так&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;$file_copy = Get-ChildItem -Path $path | Where-Object -Property CreationTime -gT $date #определяем все файлы которые нужно скопировать&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;У меня установлена старая версия, поэтому я пишу скрипт по-старому&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;Get-ChildItem -Path $path | Where-Object {$_.CreationTime -gT $date} | Copy-Item -Destination $path_new -force #Копируем все файлы которые старше даты и времени $date из папки $path в папку $path_new&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Еще не хватает записи логов, чтобы понимать что и когда копировалось.&lt;br /&gt;
В статье «&lt;a href="https://winitpro.ru/index.php/2021/03/15/logirovanie-powershell-scriptov/"&gt;Используем лог-файлы в скриптах powershell&lt;/a&gt;» приводится скрипт который можно использовать:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;$Logfile = $path_new+&amp;quot;log.txt&amp;quot; # определяем где лог-файл

function WriteLog                #функиця записи в лог-файл
{
Param ([string]$LogString)
$Stamp = (Get-Date).toString(&amp;quot;yyyy/MM/dd HH:mm:ss&amp;quot;)
$LogMessage = &amp;quot;$Stamp $LogString&amp;quot;
Add-content $LogFile -value $LogMessage
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Функция WriteLog — дописывает лог-файл, тем что в нее передали, например список файлов.&lt;/p&gt;
&lt;p&gt;Соберем скрипт полностью:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;$path_new = &amp;quot;F:\backup\&amp;quot; #папка в которую копируем

$Logfile = $path_new+&amp;quot;log.txt&amp;quot; # определяем где лог-файл
function WriteLog                #функиця записи в лог-файл
{
Param ([string]$LogString)

$Stamp = (Get-Date).toString(&amp;quot;yyyy/MM/dd HH:mm:ss&amp;quot;)
$LogMessage = &amp;quot;$Stamp $LogString&amp;quot;
Add-content $LogFile -value $LogMessage
}

$path = &amp;quot;\\FileServer\backup\&amp;quot; # папка из которой копируют
WriteLog &amp;quot;$path копирование начато&amp;quot;
$date = (Get-Date).AddDays(-1) #определение в переменную даты минус сколько-то от текущей
$file_copy = Get-ChildItem -Path $path | Where-Object {$_.CreationTime -gT $date} #определяем список файлов, для копирования и записи в лог-файл
WriteLog &amp;quot;$file_copy&amp;quot;
Get-ChildItem -Path $path | Where-Object {$_.CreationTime -gT $date} | Copy-Item -Destination $path_new -force #копирование файлов с текущей датой и временем старше -1
WriteLog &amp;quot;$path копирование закончено&amp;quot;&lt;/code&gt;&lt;/pre&gt;&lt;div class="e2-text-picture"&gt;
&lt;img src="https://blog.fossko.ru/pictures/nkfile15---Podklyuchenie-k-udalennomu-rabochemu-stolu-2022-04-07-15.21.21.jpg" width="667" height="518" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;По логу можно посмотреть дату и время начала каждой операции. Это полезно, если скрипт запускается по расписанию.&lt;/div&gt;
&lt;/div&gt;
</description>
</item>


</channel>
</rss>