• Как обойти перезатирание строк при большом количестве вызовов скрипта, создающего новые строки в гугл таблице?

    stomaks
    @stomaks
    Разработчик Google Apps Script (stomaks.me)
    Вариант 1 - Использовать локсервис (подробнее в документации google appsscript)
    Вариант 2 - Сначала сохранять данные кеш скрипта, и настроить триггер который раз в минуту вытаскивает данные из кеша и кладет в таблицу.
    Вариант 3 - Использовать sheet.append()
    Вариант 4 - Сохранять не в таблицу а в базу данных
    Вариант 5 - После каждой вставки строки setValue или до, использовать SpreadsheetApp.flush() (но этот вариант не очень хорош сам по себе, его лучше использовать в совокупности с другими)

    ___
    stomaks.me
    g-apps-script.com
    Ответ написан
  • Как проверить наполнение таблицы?

    oshliaer
    @oshliaer Куратор тега Google Sheets
    Google Products Expert
    К сожалению, API по истории так и нет.

    Я, например, проверяю дату изменения, сравниваю с кешем, беру хэш от требуемого диапазона, если хэши неравны, то начинаю сравнивать массивы (в питоне алгоритмов завались ).
    Ответ написан
  • Какие параметры функции существуют, чтобы функция была непрерывна?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Пределы функции слева и справа в особых точках должны быть равны.
    5fb02a1f41975663698057.gif
    Ответ написан
  • Какой вопрос Вы бы задали помощнику системного администратора на собеседовании?

    lsoul
    @lsoul
    Неожиданно - юрист
    «Что такое Хабр?»
    Так ли важно, как расшифровывается биос? Сразу вспоминается известный сериал, про отдел техподдержки и расшифровку аббревиатуры IT )
    Ответ написан
  • Как правильно написать функцию в ячейке EXCEL, чтобы появлялся определенный ряд последовательности чисел?

    @ComodoHacker
    По сути нам нужно узнать размер всего диапазона и место текущей ячейки в нем. Главная проблема — избежать циклических ссылок.

    Например, с помощью COUNTA() можно определить, сколько ячеек заполнено слева. Или справа. Но вот использовать и то, и другое в одной формуле не получается, т.к. возникают циклические ссылки.

    Позицию текущей ячейки можно ещё определить с помощью COLUMN() и вычесть фиксированное смещение. Это небольшой хак, может можно и лучше.

    Дальше уже простая арифметика. Получаем распределение в диапазоне 0-1, умножаем на 3, округляем.

    Например, для начальной ячейки C4:
    =CEILING((COUNTA(D4:$XFD4) + 1) / (COUNTA(D4:$XFD4) + COLUMN() - 2) * 3; 1)

    Для другой начальной ячейки нужно поправить константу в "COLUMN() - 2".
    Ответ написан
  • Какие книги помогут стать Junior на JS?

    like-a-boss
    @like-a-boss
    Признайся,тебяТянетНаКодМужика,ты—программный гей
    Книги - вода, прочтите learn.javascript.ru и станете кем захотите, хоть единорогом.
    Ответ написан
  • Почему происходит "Сайт localhost выполнил переадресацию слишком много раз"?

    Robur
    @Robur
    Знаю больше чем это необходимо
    Заходит пользователь на admin/login чтобы зарегистрироваться. А там ваш кусочек кода срабатывает, смотрит есть ли куки, кук нет, значит отправляем пользователя на admin/login. Идет пользователь на admin/login чтобы зарегистрироваться. А там ваш кусочек кода срабатывает, смотрит есть ли куки, кук нет, значит отправляем пользователя на admin/login. Идет пользователь на admin/login чтобы зарегистрироваться. А там ваш кусочек кода срабатывает, смотрит есть ли куки, кук нет, значит отправляем пользователя на admin/login. Идет пользователь на admin/login чтобы зарегистрироваться. А там ваш кусочек кода срабатывает, смотрит есть ли куки, кук нет, значит отправляем пользователя на admin/login. Заходит пользователь на admin/login ....
    .... проходит время ...

    браузеру это все надоедает и он останавливает этот веселый процесс.
    Ответ написан
  • Кайфую от геометрии и физики, есть какие-то ресурсы на подобии описанного в вопросе?

    15432
    @15432
    Системный программист ^_^
    Не уроки, но я надолго залип

    Я.И. Перельман
    • Занимательная физика
    • Занимательная механика
    • Занимательная геометрия
    • Занимательная арифметика
    • Занимательная астрономия
    Ответ написан
  • Чем защитить лидар от погоды?

    Ocelot
    @Ocelot
    Обычный поликарбонат, он нормально пропускает ближний ИК до 1100 нм (лидар работает на 960нм обычно). "Цветное стекло" - это узкополосный фильтр, чтобы лидар не слепило внешней засветкой.
    Ответ написан
  • Какие существуют практические примеры применения арифметики колец и полей?

    wataru
    @wataru
    Разработчик на С++, гуглер, экс-олимпиадник.
    В криптографии просто куча применений. Всякие RSA, DH, эллиптические кривые - это все основано на свойствах некоторых особых конечных полей.

    Но мне нравится такой пазл: есть таблица из лампочек-кнопок n x m. Какие-то горят, какие-то - нет. Можно нажать на какую-то лампочку и она переключится. Но вместе с ней переключатся и 4 соседние лампы (если нажали на угловую кнопку - то только 2). Нужно погасить все лампы за минимальное количество нажатий. Как ее вообще решать без полного или частичного перебора? Важно заметить, что 2 раза нажимать на лампу бессмысленно, потому что эти 2 нажатия просто отменят друг друга. Еще не важно, в каком порядке нажимать на лампы. Конечный результат будет одинаковый.

    А дальше, подключается математика! Введем переменные x_ij - сколько раз мы нажимаем на лампочку в позиции i, j. Эти переменные - это элементы поля по модулю 2. Потому что 2 раза нажать на кнопку - то же самое, что и 0 раз нажать. Составляем линейные уравнения, что сумма нажатий на все кнопки, влияющие на данную лампу - дает 0 или 1 по модулю 2 (в зависимости от того, горит ли эта лампа изначально).

    А дальше эту систему уравнений можно просто решать методом гаусса. Почему? Ведь он работает с вещественными числами? Но нет! Гауссу по-фигу над каким полем работать. Делаем все вычисления по модулю 2 - и получим решение в виде 0 и 1 для всех переменных.

    Поля по модулю простых чисел еще можно, например, использовать для реализации быстрого преобразования фурье для быстрого умножения длинных чисел без использования операций с float, что требуется в стандартной реализации (она вообще с комплексными числами работает). И такая реализация быстрее и точнее.
    Ответ написан
  • Как выбрать элементы со ссылкой установленного формата (regex)?

    fallus
    @fallus
    $('a[href^="#"]')

    Выборка всех <a>, href которых начинается с #

    Если ссылка именно что в формата site.com/url.html#id, то можно так:
    $('a[href*=".html#"]')
    Ответ написан
  • Как правильно отправить запрос с заголовками и куками?

    hottabxp
    @hottabxp Куратор тега Python
    Миллиардер. Честно, 100 пистонов!
    Можно еще так - "Copy as cURL", далее идёте на сайт curl.trillworks.com и конвертируете в код Python.
    Ответ написан
  • Как получить ответ от вызванного через POST/GET скрипта в виде return?

    stomaks
    @stomaks
    Разработчик Google Apps Script (stomaks.me)
    Вероятно вы хотите развернуть ваш скрипт как апи сервис?

    Если это так, то сделайте следующее:
    1. Меню Опубликовать > Развернуть как веб-приложение, в настройках выберите от моего имени и для всех включая анонимных пользователей.
    2. В функции doPost или doGet возвращайте ContentService, в зависимости от того кокой результат ожидаете, такой формат результата и указывайте, например так:

    function doGet(e) {
      const result = {};
      
      // ваш код
      
      if ( e.parameter.callback ) {
        return ContentService
        .createTextOutput(`${ e.parameter.callback }(${ JSON.stringify(result) })`)
        .setMimeType(ContentService.MimeType.JAVASCRIPT);
      } else {
        return ContentService
        .createTextOutput(JSON.stringify(result))
        .setMimeType(ContentService.MimeType.JSON);
      }
    }


    Официальная документация
    https://developers.google.com/apps-script/guides/c...

    Типы ответов:
    https://developers.google.com/apps-script/referenc...

    ___
    stomaks.me
    g-apps-script.com
    Ответ написан
  • Как узнать уровень заряда аккумулятора через ардуино нано?

    Для того, чтобы точно узнать заряд, нужно интегрировать мощность, отбираемую от аккумулятора при разрядке и сообщаемую ему при зарядке. Обычно для этого применяют специальные микросхемы.
    Если высокая точность не нужна, можно измерять только напряжение аккумулятора. При этом возможны нелинейности или измеряемый процент заряда может иногда плавать, но схемотехника и код значительно проще.
    Ответ написан
  • Какие материалы считаются лучшими для глубоко изучения JS?

    @dmitry-toster
    Для глубоко изучения JS

    Вряд ли есть что-то лучше серии книг Kyle Simpson - You don't know JS, где одной только теме про thisили замыканию уделена целая книга

    Интересен супер подробный разбор event loop

    Помимо книг выше, есть также отличное видео на YouTube после которого отпадут все вопросы как оно работает

    Что можно считать лучшим источником

    Собственно Standard ECMA-262
    Ответ написан
  • Как оптимизировать работу с файлами в Python?

    Или лучше в VBA погрузиться для решения подобных задач?

    VBA - однопоточный, расспаралелить не получится.

    но если только собрать названия листов, то странно большое время у Вас для такой задачи.
    Я тут на коленке набросал код на VBA, так он 200 файлов за 4 минуты обработал, и это без оптимизации кода (excel 32, win 10, 4ядра по 3ГГц).
    Можете запустить у себя, для этого открыть новую книгу, открыть редактор макросов, выбрать лист на котором будете работать и вставить следующий код (полной заменой)
    Код для сбора списка листов из всех книг директории
    Function FilenamesCollection(ByVal FolderPath As String, Optional ByVal Mask As String = "", _
                                 Optional ByVal SearchDeep As Long = 999) As Collection
        ' © EducatedFool  excelvba.ru/code/FilenamesCollection
        ' Получает в качестве параметра путь к папке FolderPath,
        ' маску имени искомых файлов Mask (будут отобраны только файлы с такой маской/расширением)
        ' и глубину поиска SearchDeep в подпапках (если SearchDeep=1, то подпапки не просматриваются).
        ' Возвращает коллекцию, содержащую полные пути найденных файлов
        ' (применяется рекурсивный вызов процедуры GetAllFileNamesUsingFSO)
    
        Set FilenamesCollection = New Collection    ' создаём пустую коллекцию
        Set FSO = CreateObject("Scripting.FileSystemObject")    ' создаём экземпляр FileSystemObject
        GetAllFileNamesUsingFSO FolderPath, Mask, FSO, FilenamesCollection, SearchDeep ' поиск
        Set FSO = Nothing     ' очистка строки состояния Excel
    End Function
     
    Function GetAllFileNamesUsingFSO(ByVal FolderPath As String, ByVal Mask As String, ByRef FSO, _
                                     ByRef FileNamesColl As Collection, ByVal SearchDeep As Long)
        ' перебирает все файлы и подпапки в папке FolderPath, используя объект FSO
        ' перебор папок осуществляется в том случае, если SearchDeep > 1
        ' добавляет пути найденных файлов в коллекцию FileNamesColl
        On Error Resume Next: Set curfold = FSO.GetFolder(FolderPath)
        If Not curfold Is Nothing Then    ' если удалось получить доступ к папке
    
            ' раскомментируйте эту строку для вывода пути к просматриваемой
            ' в текущий момент папке в строку состояния Excel
            ' Application.StatusBar = "Поиск в папке: " & FolderPath
    
            For Each fil In curfold.Files    ' перебираем все файлы в папке FolderPath
                If fil.Name Like "*" & Mask Then FileNamesColl.Add fil.Path
            Next
            SearchDeep = SearchDeep - 1    ' уменьшаем глубину поиска в подпапках
            If SearchDeep Then    ' если надо искать глубже
                For Each sfol In curfold.SubFolders    ' перебираем все подпапки в папке FolderPath
                    GetAllFileNamesUsingFSO sfol.Path, Mask, FSO, FileNamesColl, SearchDeep
                Next
            End If
            Set fil = Nothing: Set curfold = Nothing    ' очищаем переменные
        End If
    End Function
    
    Sub LoopThroughFiles(ByVal sDirName As String, ByRef lRow As Long, ByVal sMask As String)
       On Error Resume Next
       Dim folder$, coll As Collection
       Dim EX As Excel.Application
       Dim wkb As Workbook
       Dim wks As Worksheet
       Dim file As Variant
       Dim i As Long
       Dim v As Variant
       
     
        folder$ = sDirName
        If Dir(folder$, vbDirectory) = "" Then
            MsgBox "Не найдена папка «" & folder$ & "»", vbCritical
            Exit Sub        ' выход, если папка не найдена
        End If
     
        Set coll = FilenamesCollection(folder$, sMask)        ' получаем список файлов по маске из папки
        If coll.Count = 0 Then
    '        MsgBox "В папке «" & Split(folder$, "\")(UBound(Split(folder$, "\")) - 1) & "» нет ни одного подходящего файла!", _
                   vbCritical, "Файлы для обработки не найдены"
            Exit Sub        ' выход, если нет файлов
        End If
     
       Set EX = New Application
       EX.Visible = False
       
       ' перебираем все найденные файлы
       For Each file In coll
        
          Cells(lRow, 2) = CStr(file)
          
          Set wkb = EX.Workbooks.Open(Filename:=file)
    
          ' Если книга не пуста
          If wkb.Sheets.Count > 0 Then
             i = 1
             ReDim v(1 To wkb.Sheets.Count)
             ' Получаем названия листов
             For Each wks In wkb.Sheets
                v(i) = wks.Name
                i = i + 1
             Next wks
    
          End If
    
          Cells(lRow, 3) = Join(v, ",")
    
          wkb.Close False
                
          DoEvents
          
          lRow = lRow + 1
        
          DoEvents
        Next file
        
       Set wks = Nothing: Set wkb = Nothing: Set EX = Nothing
       Set colShts = Nothing
        
    End Sub
    
    Sub LoopThroughDirs()
       Dim lLastRow As Long
       Dim lRow As Long
       Dim i As Long
       Dim v As Variant
       Dim dTime As Double
    
       lRow = 2
       lLastRow = Cells(Rows.Count, 1).End(xlUp).Row
       
       v = Range(Cells(2, 1), Cells(lLastRow, 2))
       
       dTime = Time()
       For i = LBound(v) To UBound(v)
          Application.StatusBar = "Обрабатывается директория " & i & " из " & UBound(v)
          Call LoopThroughFiles(v(i, 1), lRow, "*.xls")
          Call LoopThroughFiles(v(i, 1), lRow, "*.xlsx")
          Call LoopThroughFiles(v(i, 1), lRow, "*.xlsm")
          DoEvents
       Next i
       MsgBox "Готово за " & CStr(CDate(Time() - dTime))
    End Sub


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

    Запустить процедуру LoopThroughDirs, для этого поставить курсор на название и нажать F5

    Результат
    5f05adc35867d361594006.png
    Ответ написан
  • Когда следует создавать функции?

    oshliaer
    @oshliaer
    Google Products Expert
    Пример заметного количества функций https://github.com/contributorpw/lodashgs/blob/mas... Время работы скрипта растет минимально. Многие пользуются. Дело не в размере. Тем более, что скрипты хорошенько сжимаются перед исполнением. И вот этот файл https://github.com/contributorpw/alasqlgs/blob/mas... (не открывать при медленной сети) работает нормально даже в качестве пользовательской функции, а там, на секундочку, всего полминуты времени исполнения.

    Вы привели в примере SpreadsheetApp.flush(). Этот метод останавливает все расчеты и пересчитывает все, что находится у вас в Таблице. Вероятно, из-за него у вас и проблемы.

    Судя по предыдущим вашим вопросам, вы усиливаете работу интерфейса, давите на впечатление. Ну, так в браузере оно будет работать так как будет работать, и заставить это всё работать быстрее не получится.

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

    , потому что это все ерунда, и никому не надо смотреть на экран, чтобы понимать, что там работает, а что нет. Пользователю нужно знать три вещи:
    1. Еще не считало
    2. Еще считает
    3. Уже посчитало

    Остальное для него мрак и туман, а вы тратите на них время.
    Ответ написан
  • Как изменить привязанный к Google таблице скрипт извне?

    oshliaer
    @oshliaer Куратор тега Google Sheets
    Google Products Expert
    Это можно сделать через Script API



    Есть куча тонкостей, которые связывает история разработки сервиса, поэтому, если у вас есть в среде nodejs, то я бы рекомендовал использовать cli для проектов Google Apps Script @google/clasp.
    Ответ написан