Сообщество - MS, Libreoffice & Google docs

MS, Libreoffice & Google docs

734 поста 14 935 подписчиков

Популярные теги в сообществе:

Как я научил бухгалтерию составлять договора дарения со скоростью 1 договор в 4 секунды

В статье разбираю конкретный пример - как при помощи Google Apps Script на основании шаблона, созданного в Гугл Документах массово создавать договора дарения из строк Гугл Таблицы.

Массово создавать типовые договора можно когда есть документ-шаблон с готовым форматированием и в нём промаркированы ключевые поля, которые идут под замену для каждой новой строчки таблицы. После автозамены копия заполненного шаблона сохраняется с установленным именем в виде Гугл Документа и может сразу автоматически преобразована в PDF или файл Microsoft Word.

Автозаполнение договоров дарения

Во многих организациях бухгалтеры отвечают за составление договоров дарения от организации. Эта задача может быть однотипной, трудоемкой и подверженной ошибкам при выполнении вручную. Все данные скорее всего хранятся в 1С, но из неё можно сделать экспорт в Эксель и дальше скопировать в Гугл Таблицы:

Как я научил бухгалтерию составлять договора дарения со скоростью 1 договор в 4 секунды Программирование, Гайд, Программа, Длиннопост

Таблица с исходными данными

Используя скрипт Google Apps, этот процесс можно полностью автоматизировать. Скрипт извлекает данные из таблицы Google, содержащей сведения о сотрудниках:

  • Дата заключения договора

  • ФИО

  • Должность

  • Сумма

  • Подарок

  • Паспорт

  • ИНН

Затем составляется однотипный шаблон документа Google для всех сотрудников:

Как я научил бухгалтерию составлять договора дарения со скоростью 1 договор в 4 секунды Программирование, Гайд, Программа, Длиннопост

Верхняя часть однотипного шаблона документа Google

Как я научил бухгалтерию составлять договора дарения со скоростью 1 договор в 4 секунды Программирование, Гайд, Программа, Длиннопост

Нижняя часть однотипного шаблона документа Google

После этого время работы гугл скрипта.

Скрипт автозаполнения договоров

Ниже приведён скрипт автозаполнения договоров дарения, написанный на Google Apps Script. Это скриптовый язык программирования, который используется для автоматизации работы с сервисами Google, такими как Gmail, Google Docs, Sheets, Slides, Forms и другими. Он позволяет создавать пользовательские функции, макросы и приложения, которые могут взаимодействовать с данными внутри этих сервисов. Это мощный инструмент для повышения производительности труда и улучшения взаимодействия между различными компонентами экосистемы Google:

function generateDocumentsFromSpreadsheet() {

// Подробнее: https://pikabu .ru/story/kak_ya_nauchil_bukhgalteriyu_sostavlyat_dogovora_dareniya_so_skorostyu_1_dogovor_v_4_sekundyi_11859028?cid=323554940

console.log(`Функция generateDocumentsFromSpreadsheet начала работу в ${(new Date()).toLocaleString("ru-RU")}`);

// Доступ к таблице и получение данных

const ss = SpreadsheetApp.getActiveSpreadsheet();

const sheet = ss.getSheetByName("Автозаполнение"); // Измените на название вашего листа

const data = sheet.getDataRange().getValues(); // Получаем все данные с таблицы

// Открытие шаблона Google Документа

const templateDocId = "1y2XQhZBХХХХХХХХХХХХХzyfnXh8yUQ"; // Замените на настоящий идентификатор вашего шаблона

const templateDoc = DriveApp.getFileById(templateDocId);

const templateFolder = templateDoc.getParents().next(); // Получаем папку, в которой находится шаблон

// Проходим по каждой строке (начиная со второй, чтобы пропустить заголовки)

for (let i = 1; i < data.length; i++) {

const [rawDate, fullName, position, rawAmount, gift, passport, tin] = data[i]; // Получаем данные из строки таблицы

console.log(`Работаем с ${fullName}.`);

let formattedAmount = '';

formattedAmount = rawAmount + " (" + FloatToSamplesInWordsRus(rawAmount) + ")" // Форматируем сумму как текст (включая пропись)

// Форматируем дату

let formattedDate = '';

if (rawDate instanceof Date) {

formattedDate = Utilities.formatDate(rawDate, Session.getScriptTimeZone(), "dd.MM.yyyy"); // Преобразуем дату в формат "дд.мм.гггг"

}

// Создание нового документа на основе шаблона

const copyDoc = templateDoc.makeCopy(`Заполненный - ${fullName}`); // Копируем шаблон и называем новый документ по ФИО

const copyDocId = copyDoc.getId();

// Открываем новый документ

const copyDocAsDoc = DocumentApp.openById(copyDocId);

const copyDocBody = copyDocAsDoc.getBody();

// Замена шаблонных полей на данные из таблицы

copyDocBody.replaceText('Дата', formattedDate);

copyDocBody.replaceText('ФИО', fullName);

copyDocBody.replaceText('Должность', position);

copyDocBody.replaceText('Сумма', formattedAmount);

copyDocBody.replaceText('Подарок', gift);

copyDocBody.replaceText('Паспорт', passport);

copyDocBody.replaceText('ИННномер', tin);

// Замена текста полей на соответствующие данные

// Сохранение и закрытие заполненного документа

copyDocAsDoc.saveAndClose();

// Преобразование документа в PDF, если надо

// const pdfBlob = DriveApp.getFileById(copyDocId).getAs("application/pdf");

// Сохранение копии PDF на Google Диске

// const pdfFile = templateFolder.createFile(pdfBlob).setName(`Заполненный - ${fullName}.pdf`);

// Дополнительно: удалите промежуточный Google Документ, если нужен только PDF

// DriveApp.getFileById(copyDocId).setTrashed(true);

}

console.log(`Функция generateDocumentsFromSpreadsheet закончила работу в ${(new Date()).toLocaleString("ru-RU")}`);

}

// Карта для преобразования чисел в слова (рубли) отсюда https://habr.com/ru/articles/104057/

var mapNumbers = {

0: [2, 1, "ноль"],

1: [0, 2, "один", "одна"],

2: [1, 2, "два", "две"],

3: [1, 1, "три"],

4: [1, 1, "четыре"],

5: [2, 1, "пять"],

6: [2, 1, "шесть"],

7: [2, 1, "семь"],

8: [2, 1, "восемь"],

9: [2, 1, "девять"],

10: [2, 1, "десять"],

11: [2, 1, "одиннадцать"],

12: [2, 1, "двенадцать"],

13: [2, 1, "тринадцать"],

14: [2, 1, "четырнадцать"],

15: [2, 1, "пятнадцать"],

16: [2, 1, "шестнадцать"],

17: [2, 1, "семнадцать"],

18: [2, 1, "восемнадцать"],

19: [2, 1, "девятнадцать"],

20: [2, 1, "двадцать"],

30: [2, 1, "тридцать"],

40: [2, 1, "сорок"],

50: [2, 1, "пятьдесят"],

60: [2, 1, "шестьдесят"],

70: [2, 1, "семьдесят"],

80: [2, 1, "восемьдесят"],

90: [2, 1, "девяносто"],

100: [2, 1, "сто"],

200: [2, 1, "двести"],

300: [2, 1, "триста"],

400: [2, 1, "четыреста"],

500: [2, 1, "пятьсот"],

600: [2, 1, "шестьсот"],

700: [2, 1, "семьсот"],

800: [2, 1, "восемьсот"],

900: [2, 1, "девятьсот"]

};

var mapOrders = [{

_Gender: true,

_arrStates: ["рубль", "рубля", "рублей"]

},

{

_Gender: false,

_arrStates: ["тысяча", "тысячи", "тысяч"]

},

{

_Gender: true,

_arrStates: ["миллион", "миллиона", "миллионов"]

},

{

_Gender: true,

_arrStates: ["миллиард", "миллиарда", "миллиардов"]

},

{

_Gender: true,

_arrStates: ["триллион", "триллиона", "триллионов"]

}

];

var objKop = {

_Gender: false,

_arrStates: ["копейка", "копейки", "копеек"]

};

function Value(dVal, bGender) {

var xVal = mapNumbers[dVal];

if (xVal[1] == 1) {

return xVal[2];

} else {

return xVal[2 + (bGender ? 0 : 1)];

}

}

function From0To999(fValue, oObjDesc, fnAddNum, fnAddDesc) {

var nCurrState = 2;

if (Math.floor(fValue / 100) > 0) {

var fCurr = Math.floor(fValue / 100) * 100;

fnAddNum(Value(fCurr, oObjDesc._Gender));

nCurrState = mapNumbers[fCurr][0];

fValue -= fCurr;

}

if (fValue < 20) {

if (Math.floor(fValue) > 0) {

fnAddNum(Value(fValue, oObjDesc._Gender));

nCurrState = mapNumbers[fValue][0];

}

} else {

var fCurr = Math.floor(fValue / 10) * 10;

fnAddNum(Value(fCurr, oObjDesc._Gender));

nCurrState = mapNumbers[fCurr][0];

fValue -= fCurr;

if (Math.floor(fValue) > 0) {

fnAddNum(Value(fValue, oObjDesc._Gender));

nCurrState = mapNumbers[fValue][0];

}

}

fnAddDesc(oObjDesc._arrStates[nCurrState]);

}

function FloatToSamplesInWordsRus(fAmount) {

var fInt = Math.floor(fAmount + 0.005);

var fDec = Math.floor(((fAmount - fInt) * 100) + 0.5);

var arrRet = [];

var iOrder = 0;

var arrThousands = [];

for (; fInt > 0.9999; fInt /= 1000) {

arrThousands.push(Math.floor(fInt % 1000));

}

if (arrThousands.length == 0) {

arrThousands.push(0);

}

function PushToRes(strVal) {

arrRet.push(strVal);

}

for (var iSouth = arrThousands.length - 1; iSouth >= 0; --iSouth) {

if (arrThousands[iSouth] == 0) {

continue;

}

From0To999(arrThousands[iSouth], mapOrders[iSouth], PushToRes, PushToRes);

}

if (arrThousands[0] == 0) {

// Handle zero amount

if (arrThousands.length == 1) {

PushToRes(Value(0, mapOrders[0]._Gender));

}

var nCurrState = 2;

PushToRes(mapOrders[0]._arrStates[nCurrState]);

}

if (arrRet.length > 0) {

// Capitalize first letter

arrRet[0] = arrRet[0].match(/^(.)/)[1].toLocaleUpperCase() + arrRet[0].match(/^.(.*)$/)[1];

}

arrRet.push((fDec < 10) ? ("0" + fDec) : ("" + fDec));

From0To999(fDec, objKop, function () {}, PushToRes);

return arrRet.join(" ");

}

Процесс выполнения:

Как я научил бухгалтерию составлять договора дарения со скоростью 1 договор в 4 секунды Программирование, Гайд, Программа, Длиннопост

Скорость заполнения: 3-4 секунды на 1 договор.

Результат

После выполнения скрипта создаётся необходимое количество договоров дарения в папке расположения таблицы:

Как я научил бухгалтерию составлять договора дарения со скоростью 1 договор в 4 секунды Программирование, Гайд, Программа, Длиннопост

Как воспользоваться этим кодом?

Чтобы вставить и запустить скрипт Google Apps в таблицу Google, выполните следующие действия:

  1. Откройте Google Таблицы: начните с открытия своей таблицы Google.

  2. Откройте редактор скриптов: нажмите «Расширения» в меню, затем выберите «Скрипт приложений». Это откроет редактор скриптов приложений на новой вкладке.

  3. Вставьте скрипт: в редакторе скриптов удалите код-заполнитель. Затем вставьте скрипт Google Apps выше в редактор.

  4. Сохраните скрипт: нажмите значок дискеты или нажмите «Ctrl+S», чтобы сохранить скрипт. Дайте ему осмысленное имя, если будет предложено.

  5. Авторизуйте скрипт: если ваш скрипт взаимодействует со службами Google (например, Таблицами, Календарем), вам необходимо предоставить ему разрешение. Нажмите кнопку «Запустить» (значок воспроизведения) и следуйте инструкциям по авторизации.

  6. Запустите скрипт: После авторизации снова нажмите «Запустить». Скрипт будет запущен и выполнит действия по автозаполнению договоров дарения.

С этого момента вы можете легко запустить скрипт из редактора скриптов или создать пользовательское меню или кнопку в своей таблице для его запуска.

Где ещё можно использовать?

Подобные скрипты могут использоваться и для других целей:

  • Автоматизированные ведомости по заработной плате для отделов кадров
    Бухгалтерия микроприятий (большие пользуются уже чем-то другим) могут создавать ведомости по заработной плате для каждого работника. Используя подобный скрипт, они смогут автоматически вносить такие сведения, как фамилия, должность, зарплата из главной таблицы, формируя документы по оплате труда.

  • Создание юридических документов
    Юридические отделы часто обрабатывают большой объем стандартизированных договоров и соглашений, в которых от клиента к клиенту меняется лишь несколько деталей. Извлекая данные из электронной таблицы (имя клиента, сумма контракта, даты), этот скрипт может автоматически генерировать соответствующие документы за считанные секунды.

  • Табели успеваемости или сертификаты школьников
    Школы и университеты могут использовать подобный скрипт для создания табелей успеваемости или сертификатов для учащихся. Сохраняя имена, оценки и достижения учащихся в электронной таблице, скрипт может генерировать персонализированный отчет или сертификат для каждого учащегося.

  • Персонализированные приглашения и таблички для мероприятий
    Организаторам мероприятий часто требуется отправлять персонализированные приглашения или создавать именные значки для участников. Используя подобный скрипт можно извлекать данные участников из электронной таблицы и генерировать пригласительные письма или таблички в формате PDF, готовые к печати.

Итоги

Бухгалтерам больше не нужно вручную создавать каждое соглашение, что экономит время и устраняет потенциальные ошибки при вводе данных. Вместо этого они могут положиться на скрипт для создания и хранения всех соглашений в организованной структуре папок на Google Диске, готовых к просмотру и распространению. Такая автоматизация не только оптимизирует административные рабочие процессы, но и обеспечивает согласованность и легкий доступ к записям.

Автор: Михаил Шардин

30 сентября 2024 г.

Показать полностью 5

Как я при помощи двух скриптов смог автоматически сгенерировать опись документов для 700 страниц

Иногда бывают такие задачи за которые браться не хочется - например на фотографии реальная пачка документов около 700 страниц для которой надо составить сопроводительное письмо - то есть сделать опись документов. По примерной прикидке - ручной работы на целый день как минимум.

Как я при помощи двух скриптов смог автоматически сгенерировать опись документов для 700 страниц Программирование, Малый бизнес, Длиннопост

Реальная фотография с документами

Ситуацию несколько облегчает то, что на эти распечатанные документы есть исходные Excel файлы. В итоге поиск и написание решения заняло около часа и в случае повторной работы займёт около 5 минут собственного времени.

Часть 1: Visual Basic for Applications (VBA)

Visual Basic for Applications (VBA) – это язык программирования, который позволяет автоматизировать задачи и создавать макросы для приложений Microsoft Office. Проще говоря, VBA помогает пользователям автоматизировать повторяющиеся задачи, такие как создание отчетов, форматирование документов и многое другое.

В данном случае преимуществом было то, что все документы однотипные и созданы по шаблону - по форме КС-3. Форма КС-3 относится к документации в сфере строительства и представляет собой "Справку о стоимости выполненных работ и затрат".

Как я при помощи двух скриптов смог автоматически сгенерировать опись документов для 700 страниц Программирование, Малый бизнес, Длиннопост

Эта форма для каждого адреса хранилась в файле который назывался "+КС-3.xlsx": внутри основного каталога было множество подкаталогов и файл имел две очень важные ячейки:

  • Ячейка A10 - содержала название.

  • Ячейка I36 - содержала стоимость.

Во всех документах эти ячейки не меняются и данные можно автоматически собрать в Экселе при помощи скрипта, который обходит основной каталог и все вложенные:

Sub CopyDataFromFiles()
Dim FileSystem As Object
Dim objFile As Object
Dim objFolder As Object
Dim wbSource As Workbook
Dim wsSource As Worksheet
Dim wsDest As Worksheet
Dim DestRow As Long
Dim FileExt As String
Dim FilePath As String
Dim DestColumn As Long

' pikabu. ru/story/kak_ya_pri_pomoshchi_dvukh_skriptov_smog_avtomaticheski_sgenerirovat_opis_dokumentov_dlya_700_stranits_11812093

Set FileSystem = CreateObject("Scripting.FileSystemObject")
Set wsDest = ThisWorkbook.Sheets(1) ' Данные будут скопированы на первый лист
DestColumn = 2 ' Столбец B

Application.ScreenUpdating = False

' Вызов рекурсивной функции для обработки каждого файла
ProcessFiles FileSystem.GetFolder(ThisWorkbook.Path), wsDest, DestColumn

Application.ScreenUpdating = True
End Sub

Sub ProcessFiles(ByVal objFolder As Object, ByVal wsDest As Worksheet, ByVal DestColumn As Long)
Dim objFile As Object
Dim wbSource As Workbook
Dim wsSource As Worksheet
Dim DestRow As Long

' Пройтись по каждому файлу в каталоге
For Each objFile In objFolder.Files
If InStr(objFile.Name, "+КС-3.xlsx") > 0 Then
' Открытие исходную рабочую книгу
Set wbSource = Workbooks.Open(objFile.Path)
' Установка исходного рабочего листа
Set wsSource = wbSource.Sheets(1) ' Данные будут скопированы на первый лист

' Найти следующую доступную строку на листе
DestRow = wsDest.Cells(wsDest.Rows.Count, DestColumn).End(xlUp).Row + 1

' Копировать значение из ячейки A10 исходного листа в следующую доступную строку на целевом листе
wsDest.Cells(DestRow, 1).Value = wsSource.Range("A10").Value

' Копировать значение из I36 исходного листа в следующую доступную строку на целевом листе.
wsDest.Cells(DestRow, DestColumn).Value = wsSource.Range("I36").Value

' Закрыть исходную книгу без сохранения изменений
wbSource.Close SaveChanges:=False
End If
Next objFile

' Рекурсивная обработка подкаталогов
For Each objFolder In objFolder.SubFolders
ProcessFiles objFolder, wsDest, DestColumn
Next objFolder
End Sub

Результат работы скрипта - созданная таблица:

Как я при помощи двух скриптов смог автоматически сгенерировать опись документов для 700 страниц Программирование, Малый бизнес, Длиннопост

Половина работы сделана - адреса и суммы уже автоматически собраны в одну таблицу.

Часть 2: Google Apps Script

Google Apps Script – это язык программирования, созданный компанией Google для работы с различными сервисами Google, такими как Gmail, Calendar, Drive и другими. Он позволяет разработчикам создавать скрипты, которые могут автоматически выполнять определенные задачи например, управление файлами, создание отчётов - на самом деле практически любые действия.

Как сделать генерацию сопроводительного письма по готовой таблице средствами VBA я не стал разбираться, потому что был хорошо знаком с подобным решением для гугл скриптов.

Так что я перенёс таблицу из Экселя в Гугл таблицу и написал скрипт, который генерирует текст письма по простому шаблону:

function generateLetters() {
// https://pikabu. ru/story/kak_ya_pri_pomoshchi_dvukh_skriptov_smog_avtomaticheski_sgenerirovat_opis_dokumentov_dlya_700_stranits_11812093

// Получить активную таблицу и её ID
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var sheet = spreadsheet.getActiveSheet();
var spreadsheetId = spreadsheet.getId();

// Получить родительскую папку нахождения таблицы
var file = DriveApp.getFileById(spreadsheetId);
var parentFolder = file.getParents().next(); // Получить родительскую папку

// Получить все данные из таблицы
var data = sheet.getRange(2, 1, sheet.getLastRow() - 1, 2).getValues();

// Создать новый Google Документ в той же папке, что и таблица
var doc = DocumentApp.create('Автосозданое сопроводительное письмо');
var docFile = DriveApp.getFileById(doc.getId());
parentFolder.addFile(docFile); // Добавить документ в родительскую папку

var body = doc.getBody();

// Обработать каждую строку в таблице
for (var i = 0; i < data.length; i++) {
var Description = data[i][0]; // Колонка A (описание)
var price = data[i][1]; // Колонка B (цена)

// Добавить описание в виде параграфа
var paragraph = body.appendParagraph('');
paragraph.appendText((i + 1) + ". ").setBold(true);
paragraph.appendText(Description + ":");

// Создать маркированный список для каждого документа
body.appendListItem("Справка КС-3 на сумму " + price + " руб. - 2 экз.");
body.appendListItem("Акт приемки законченного строительством ХХХХХХХ - 1 экз.");
body.appendListItem("Акт выполненных работ – 2 экз.");
body.appendListItem("ЛСР - 2 экз.");
body.appendListItem("ЛСР НЦС - 2 экз.");
body.appendListItem("Единичные расценки стоимости работ на 1 стр - 1 экз.");
body.appendListItem("Расчёт затрат на командировочные расходы на 1 стр - 1 экз.");

// Добавить пустую строку между секциями
body.appendParagraph("");
}

// Сохранить и закрыть документ
doc.saveAndClose();

// Получить URL документа
var docUrl = doc.getUrl();
console.log(`Письмо создано. Можно просмотреть документ по следующей ссылке: ${docUrl}`);
}

Процесс генерации занял 4 секунды:

Как я при помощи двух скриптов смог автоматически сгенерировать опись документов для 700 страниц Программирование, Малый бизнес, Длиннопост

После этого проверил цель всей работы - созданное сопроводительное письмо и сразу с форматированием:

Как я при помощи двух скриптов смог автоматически сгенерировать опись документов для 700 страниц Программирование, Малый бизнес, Длиннопост

Итоги

В целом при помощи двух программных «костылей» смог автоматически генерировать опись документов для любой толщины папки и любого количества файлов.

Автор: Михаил Шардин

16 сентября 2024 г.

Показать полностью 4
Вопрос из ленты «Эксперты»

Автоматизировать нумерацию рисунков в publisher

Уважаемые знатоки! Перерыто уже, вроде, все. Нужна автоматическая нумерация тысяч картинок в MS publisher и Corel Drew

На вопрос "Какого лешего вы этим пользуетесь?" ответа я не знаю, и перевести сразу все на что-то другое (а на что?) нет пока возможности.

Итак, есть сборники иллюстраций в Корел и MS publisher - после завершения сборки альбомов надпись типа "Рис. Белые фугли на красном кампуре, вид с севера" надо менять на порядковые "Рис. 22. Белые фугли на красном кампуре, вид с севера". Подписи разные, совпадений нет (меняется направление, меняется цвет фуглей и т.п.). Сейчас это делается руками, по порядку. И это Ад, ибо их тысячи. Но я не верю, что вообще никак совсем нельзя оптимизировать и автоматизировать! Какая то команда замены, автотекста - что-то же обязано быть! Помогите! Я копаю с утра, уже дошла до форумов начала тысячелетия, пока никак. А скоро притащат альбомы.

Через слияние с присвоением номеров в отдельной таблице пробовала, не то. Тот метод хорош, когда надо пронумеровать кучу страниц с идентичным содержимым, но разным номером. Блин, они придумали специальную фишку для создания лотерейных билетов. Не может быть, что для иллюстраций не придумали.

Пикабушники, рискнете бросить вызов хранителям стихий?

Тьма, угрожающая Эсфрозену, добралась и до Пикабу. Берите лучших воинов и попробуйте одолеть грозных стражей!

Вычисление отсрочки старта приготовления каши на завтра утро

Иногда я живу один и ставлю с вечера кашу в мультиварке, чтобы она приготовилась к времени моего завтрака.

И раньше я постоянно путался - какую отсрочку старта поставить вечером, чтобы каша была готова к определенному времени утром?

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

Проблема выбора времени для приготовления каши

Время завтрака очень важно и я никогда его не пропускаю. Обычно завтракаю довольно рано. Проблема расчёта времени действительно актуальна для меня. Пытался считать отсрочку старта приготовления каши на завтра на калькуляторе - как-то странно и долго.

Вычисление отсрочки старта приготовления каши на завтра утро Программирование, Мультиварка, Google Таблицы

Структурированный подход - таблица

Подумал, что для решения этой задачи можно использовать Google Таблицы и создать формулу, которая будет рассчитывать время отсрочки старта мультиварки в зависимости от времени, когда нужна готовая каша.

В первой колонке через формулу задаю текущее время:

=TIME(HOUR(NOW()); MINUTE(NOW()); SECOND(NOW()))

Во второй указываю время, когда каша уже должна быть готова, например, 06:00.

В третьей колонке пишу продолжительность приготовления каши в часах, например для гречки 00:40.

В последней колонке составил простую формулу, которая будет вычислять время отсрочки старта мультиварки.

Таблица тут: часовой пояс таблицы Пермь, а это значит Москва +2 часа - это можно изменить в Вашей копии через меню Файл > Настройки таблицы.

Вычисление отсрочки старта приготовления каши на завтра утро Программирование, Мультиварка, Google Таблицы

Итоги

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

Показать полностью 2

Продолжение поста «Excel закрывается при открытии файла»1

Отвечу на свой вопрос, нашел решение, вдруг кому-то поможет. Если файл начинает вылетать, заходим в эксель с отключенным запуском макросов и запросов, заходим в vba (тогда при заходе в файл excel не сворачивается), перекомпилируем проект. Сохраняем файл. И после этого проблема с вылетом исчезает. До следующего раза.

Впр в libreoffice

Всем добрый день!
Сможет кто подсказать как в либре вывести все найденные совпадения, а не только первое?

Global Cache

Google Global Cache
Кэширующие узлы GGC представляют собой часть инфраструктуры Google, которая находится к пользователям ближе всего и располагается в сети локальных операторов.
На этих серверах временно хранится популярный контент, который часто запрашивают пользователи. Это ускоряет доступ к Google-сервисам: YouTube, Google Maps, Google Play.

Такое решение экономит полосу пропускания и компании Google, и операторам связи.

Без GGC контент, запрашиваемый пользователями, поступает напрямую с серверов Google. С кэширующими серверами всю цепочку проходит, например, только первая копия видеоролика. Запросы последующих пользователей обслуживает оборудование GGC на стороне провайдера.

При прекращении работы узлов GGC в какой-либо стране, контент с сервисов Google будет грузиться медленнее, увеличится время загрузки некоторых сайтов.
С мая 2022 года Google начала процесс отключения в РФ небольшой части серверов GGC, установленных у некоторых провайдеров. Речи о прекращении работы системы GGC в стране пока не идёт.

Google пообещала, что продолжит предоставлять пользователям из РФ бесплатные сервисы, такие как поисковик, YouTube, GMail, «Google Карты», Google Play и другие.

https://ria.ru/20220507/sssr-1786944323.html

На этой неделе в российский прокат вышел фантастический фильм «Дюна» от режиссёра Дени Вильнёва. Основанный на одноимённом романе Фрэнка Герберта, его название отсылает к песчаным дюнам – холмам, образованным под воздействием ветра.

Показать полностью 23

Global Cache

Google Global Cache
Кэширующие узлы GGC представляют собой часть инфраструктуры Google, которая находится к пользователям ближе всего и располагается в сети локальных операторов.
На этих серверах временно хранится популярный контент, который часто запрашивают пользователи. Это ускоряет доступ к Google-сервисам: YouTube, Google Maps, Google Play.

Такое решение экономит полосу пропускания и компании Google, и операторам связи.

Без GGC контент, запрашиваемый пользователями, поступает напрямую с серверов Google. С кэширующими серверами всю цепочку проходит, например, только первая копия видеоролика. Запросы последующих пользователей обслуживает оборудование GGC на стороне провайдера.

При прекращении работы узлов GGC в какой-либо стране, контент с сервисов Google будет грузиться медленнее, увеличится время загрузки некоторых сайтов.
С мая 2022 года Google начала процесс отключения в РФ небольшой части серверов GGC, установленных у некоторых провайдеров. Речи о прекращении работы системы GGC в стране пока не идёт.

Google пообещала, что продолжит предоставлять пользователям из РФ бесплатные сервисы, такие как поисковик, YouTube, GMail, «Google Карты», Google Play и другие.

https://ria.ru/20220507/sssr-1786944323.html

На этой неделе в российский прокат вышел фантастический фильм «Дюна» от режиссёра Дени Вильнёва. Основанный на одноимённом романе Фрэнка Герберта, его название отсылает к песчаным дюнам – холмам, образованным под воздействием ветра.

Показать полностью 23
Отличная работа, все прочитано!