Volond Apps
Open in Telegram
Программирование для души и от лени Добро пожаловать! У нас есть отличное сообщество любителей Excel и VBA, Google Sheet и Google Apps Script, а также всех тех, кто готов работать с этим программным обеспечением. Присоединяйтесь к нам, чтобы задавать и от
Show more246
Subscribers
No data24 hours
No data7 days
No data30 days
Posts Archive
\n\nJSON тут просто для примера. В свой вы настраиваете передаваемые на сервер данные как вам надо.\n\n3. Дорабатываем под себя и пользуемся.\n\nКак это работает?\nПри нажатии юзером кнопки в модальном окне (сайд-баре) мы через функцию \"fetch\" отправляем запрос-команду на наш сервер, где управление передаётся скриптам от имени владельца. Тем самым мы получаем полный контроль над всеми защищёнными диапазонами, листами и таблицами. А у пользователя есть только исходная таблица с разрешёнными для него диапазонами и HTML-интерфейс. Дальше он никуда залезть не сможет.\n\nP.S.\nВ приведённом примере использован асинхронный fetch и await ответа от запроса. Это нужно для стабильности работы, а также для обработки возможных вариантов ответа сервера. Можно также добавить обработчик ошибок.\nНо можно асинхронность не использовать и ответа от сервера не ждать, если он (ответ) нам не нужен. В таком случае тоже будет работать, но возможны осечки. Надёжнее первый вариант (с ожиданием ответа).","datePublished":"2023-05-12T09:42:28Z","dateModified":"2023-05-12T09:42:28Z","author":{"@type":"Organization","name":"Volond Apps","url":"https://telemetr.io/en/channels/1324917888-volondapps","image":"https://img.tlmtr.io/c/1rFdFm/5454153345871752862?ty=x"},"publisher":{"@type":"Organization","name":"Volond Apps","url":"https://telemetr.io/en/channels/1324917888-volondapps","image":"https://img.tlmtr.io/c/1rFdFm/5454153345871752862?ty=x"},"commentCount":0,"interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/ViewAction","userInteractionCount":84},{"@type":"InteractionCounter","interactionType":"https://schema.org/ShareAction","userInteractionCount":1}],"sharedContent":{"@type":"SocialMediaPosting","datePublished":"2023-05-12T07:46:07Z"}}}]}





246
base64 to cell
function test(){
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Лист1');
const base = sheet.getRange('A2').getValue().trim();
const url = `data:image/png;base64,${base}`;
const image = SpreadsheetApp.newCellImage().setSourceUrl(url).build();
sheet.getRange('B1').setValue(image);
}246
Repost from CONTRIBUTOR.PW
Еще вариант использования УФ https://docs.google.com/spreadsheets/d/1qDD9P6zMXImOqlEaEtIa2XzKZjGVOXcJ7S4nmPpIWvY/edit#gid=1690334644&range=A1
246
Синхронизация с облаком может пропасть: «Google Диск» прекращает поддержку Windows 8 и 8.1
https://www.ixbt.com/news/2023/06/08/google-windows-8-8-1.html
246
If you want a client-side solution to generate PDF document, JavaScript is the easiest way to convert HTML to PDF. There are various JavaScript library is available to generate PDF from HTML. The jsPDF is one of the best library to convert HTML to PDF using JavaScript. In this tutorial, we will show you how to generate PDF document and convert HTML to PDF using JavaScript and jsPDF library.
From:
Convert HTML to PDF using JavaScript - CodexWorld
https://www.codexworld.com/convert-html-to-pdf-using-javascript-jspdf/
246
How to Create an Interactive Heatmap Using JavaScript
https://www.freecodecamp.org/news/interactive-heatmap-in-javascript/
246
Всем привет! Как и обещал, делюсь решением, которое, возможно, кому-то будет полезно.
Дано:
Есть таблица для работы с каким-либо набором данных (в данном случае не принципиально, с каким именно). Часть интерактива по вводу-выводу данных построена на модальных HTML-окнах (для сайд-баров решение тоже подойдёт).
Задача:
Нам необходимо сделать так, чтобы обычный юзер с правами редактора не имел доступа к скриптам (даже на чтение), которые управляют защищёнными листами и/или вообще другими таблицами (также недоступными юзеру), но в таблице всё работало.
В чём сложность?
Даже, если мы откроем модальное окно (или сайд-бар) от имени владельца таблицы, то далее команды скриптам будут выдаваться от имени юзера. А если оный не имеет доступа к скриптам, то и обработки введённых им данных не произойдёт.
Собственно, само решение.
0. Опустим способы и алгоритмы работы таблицы и запуска модальных окон. В данном случае, это не важно.
1. Для перехвата управления из HTML-окна (сайд-бара) нам потребуется создать отдельный скриптовый проект, который будет развёрнут как WebApp.
1.1. В этом проекте пишем две основные функции:
function doGet(e) {
// Ваш код на Get-запрос
};
function doPost(e) {
// Ваш код на Post-запрос
return ContentService.createTextOutput( ***Какой-то ответ в HTML*** );
};
1.2. Обработку событий делаем или внутри вышеуказанных функций, если там всё просто, или отдельными функциями здесь или же через подключаемую библиотеку. В моём варианте используется библиотека, чтобы не деплоить веб-апп каждый раз заново при доработке скриптов.
1.3. После завершения работы с листингом скриптов делаем деплой как WebApp, исполнение только от имени владельца, доступ всем. При успешном равёртывании нам предложат url нашего проекта, - копируем его.
2. В скриптовой части нашего HTML-окна прописываем функцию например на кнопку:
<script>
async function sendData() {
var url = "В этих кавычках вставляем URL нашего WebApp-проекта";
var user = {
name: 'John',
surname: 'Smith'
};
var response = await fetch(url, {
method: 'POST',
body: JSON.stringify(user)
});
var result = await response.text();
};
</script>
JSON тут просто для примера. В свой вы настраиваете передаваемые на сервер данные как вам надо.
3. Дорабатываем под себя и пользуемся.
Как это работает?
При нажатии юзером кнопки в модальном окне (сайд-баре) мы через функцию "fetch" отправляем запрос-команду на наш сервер, где управление передаётся скриптам от имени владельца. Тем самым мы получаем полный контроль над всеми защищёнными диапазонами, листами и таблицами. А у пользователя есть только исходная таблица с разрешёнными для него диапазонами и HTML-интерфейс. Дальше он никуда залезть не сможет.
P.S.
В приведённом примере использован асинхронный fetch и await ответа от запроса. Это нужно для стабильности работы, а также для обработки возможных вариантов ответа сервера. Можно также добавить обработчик ошибок.
Но можно асинхронность не использовать и ответа от сервера не ждать, если он (ответ) нам не нужен. В таком случае тоже будет работать, но возможны осечки. Надёжнее первый вариант (с ожиданием ответа).