Volond Apps
221 subscribers
216 photos
28 videos
22 files
994 links
Программирование для души и от лени
Добро пожаловать! У нас есть отличное сообщество любителей Excel и VBA, Google Sheet и Google Apps Script, а также всех тех, кто готов работать с этим программным обеспечением. Присоединяйтесь к нам, чтобы задавать и от
Download Telegram
Forwarded from Михаил Х
Я для себя установил порог с строках. Где-то после 100.000 строк меняю бд на что-то другое. Даже замена spreadsheetapp на sheet api не помогает побороть глюки, разве что чуть ускоряет работу.
Из бд пока пробовал bigquery, firebase, cloud sql - все замечательно работают со скриптами.
Forwarded from volond
function joingrp(range){
var o={}
for (row of range){
if (!o[row[0]]) {
o[row[0]]=[]
}
o[row[0]].push(row[1])
}
return Object.keys(o).map(key=>[key,o[key].join("\n")])

}
Формулы Google Maps для Google Таблиц
Источник:
Используйте формулы Google Maps в Google Sheets, чтобы рассчитывать расстояния, время в пути, получать маршруты проезда, искать почтовые индексы с обратным геокодированием и многое другое!
1.Рассчитывайте расстояния между двумя городами или любыми адресами.
2.Рассчитайте время в пути (пешком, на машине или велосипеде) между двумя точками.
3.Получите координаты широты и долготы любого адреса на Google Maps.
4.Используйте обратное геокодирование, чтобы найти почтовый адрес по координатам GPS.
5.Распечатайте маршруты проезда между любыми точками на земле.
6.Получите адрес из самого почтового индекса.

P.S. Совет: повысьте производительность за счет кеширования результатов

••••••••••
Обсудить:
Самый простой способ получить файл ID из URL на Google Apps Script
Источник
function getIdFromUrl(url) {
return url.match(/[-\w]{25,}/);
}


Но не все так просто с ссылками именно на файлы на диске
Для Python:

Для фиксированной длины google drive IDs вы можете использовать это:

regex = "([\w-]){33}|([\w-]){19}"
match = re.search(regex,url)
Google drive использует 33 символа для обычных дисков и 19 символов для командных дисков

Другой подход без использования фиксированной длины, но вместо этого предшествующих паттернов:

regex = "(?<=/folders/)([\w-]+)|(?<=%2Ffolders%2F)([\w-]+)|(?<=/file/d/)([\w-]+)|(?<=%2Ffile%2Fd%2F)([\w-]+)|(?<=id=)([\w-]+)|(?<=id%3D)([\w-]+)"

match = re.search(regex,url)
Forwarded from DidacticСardsBot
Как проверить, редактирует ли текущее сообщение ответ или новый ответ

Источник:



В событии отправки формы Google Form нет поля, которое могло бы помочь узнать, является ли ответ новым или измененным ответом. Как уже сказал Сэнди в комментариях к вопросам, классы и методы Form Servicer, а также значения ответов не включают в себя что-то, что могло бы помочь в этом.


function onFormSubmit(e){
var response = e.range;
Logger.log(response.getRow());
}


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


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


/*
*
* Global Variables
*
*/

/*
* Sheet name used as destination of the form responses
*/
var sheetName = 'Form Responses';

/*
* Name of the column to be used to hold the response revision counter
* It should match exactly the header of the related column,
* otherwise it will do nothing.
*/
var revisionsColumn = 'Rev';

/*
* Responses starting row
*/
var startRow = 2;

function setRevisionCounts(e){
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);
var headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues();
var revisionsIndex = headers[0].indexOf(revisionsColumn);
var data = sheet.getDataRange().getValues();
var response = e.range;
var rowIndex = response.getRow()-1;
var rev = data[rowIndex][revisionsIndex]+1;
sheet.getRange(rowIndex+1, revisionsIndex+1).setValue(rev);
}

••••••••••
Обсудить:
image_2021-09-08_10-14-09.png
21.8 KB
Меня постигла печаль...
Что ж будем бороться...
Forwarded from Volond Apps (volond)
/*
Использование функций генератора JavaScript для диапазонов
Создание генератора диапазонов,подобного диапазонам Python или Ruby
*/
const range = (end, start = 0, step = 1) => {
function* generateRange() {
let x = start - step;
while(x < end - step) yield x += step;
}
return {
[Symbol.iterator]: generateRange
};
}

console.log([...range(7)]); // [0, 1, 2, 3, 4, 5, 6]
for (let i of range(8, 2, 2)) console.log(i); // Logs: 2, 4, 6
#JS #function #array
Forwarded from Artem
Forwarded from Google Таблицы
Небольшая статья про api, cookie, авторизацию на минималках

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

В материале от Романа Игнатова простой пример того, как на сайте без API через GAS-скрипты можно получить cookie и дальше использовать их открывая страницы, которые доступны только после авторизации пользователям.

Кажется, что это первый материал на эту тему на русском 🔥
ignatov-script.blogspot.com/2021/09/api.html

P. S. "Авторизовываться", с помощью логина и пароля в этом примере не требуется, но если для вашего сайта это необходимо – формируйте post-запрос на страницу авторизации, в payload передавайте логин и пароль и забирайте cookie уже из headers этого запроса
Вопрос
Добрый день. В ячейке стоит следующая формула =23+45+76+87+98. Как в другой ячейке вывести количество чисел? 5. Пробовал LEN. Работает только с текстами, к сожалению. =1+LEN(C15)-LEN(SUBSTITUTE(C15;"+";"")) - не работает
Ответ
=COUNTA(split(FORMULATEXT(B49);"+-*/";1;true))
Forwarded from DidacticСardsBot
Авторизация в Google Apps Script

Источник:



В 99% случаев авторизация в скрипте Google Apps чрезвычайно проста. Когда пользователь выполняет свой сценарий, он запускает его как себя с соответствующими областями авторизации. Исключения составляют:


Устанавливаемые триггеры, запускаемые от имени их автора
Веб-приложения, которые также могут запускаться от имени их автора в зависимости от настроек развертывания.
Однако что, если вам нужно предоставить своему приложению больше прав, чем те, которые будут иметь ваши предполагаемые пользователи?
••••••••••
Обсудить:
Forwarded from Michael Smirnov
QUERY с группировкой:
=QUERY({'Лист1'!A2:G}; "SELECT Col3, Col4, Col5, SUM(Col6), Col7 WHERE Col1 IS NOT NULL GROUP BY Col3, Col4, Col5, Col7 LABEL SUM(Col6) ''"; 1)

https://developers.google.com/chart/interactive/docs/querylanguage