Sometimes it is necessary to concat ranges in Google Spreadsheet. Eg, Data 1 and Data 2
| Name | Date | Sum |
|---|---|---|
| Ethan | 3/4/2017 | 31 |
| # Tutorial https://www.daimto.com/how-to-get-a-google-access-token-with-curl/ | |
| # YouTube video https://youtu.be/hBC_tVJIx5w | |
| # Client id from Google Developer console | |
| # Client Secret from Google Developer console | |
| # Scope this is a space seprated list of the scopes of access you are requesting. | |
| # Authorization link. Place this in a browser and copy the code that is returned after you accept the scopes. | |
| https://accounts.google.com/o/oauth2/auth?client_id=[Application Client Id]&redirect_uri=http://127.0.0.1&scope=[Scopes]&response_type=code | |
| # Exchange Authorization code for an access token and a refresh token. |
| # The initial version | |
| if [ ! -f .env ] | |
| then | |
| export $(cat .env | xargs) | |
| fi | |
| # My favorite from the comments. Thanks @richarddewit & others! | |
| set -a && source .env && set +a |
| /** | |
| * quickly test our function | |
| */ | |
| function test(){ | |
| var result = queryASpreadsheet('1sPevvtTMSd9LUptX8qdsw4VJf07nOal_1qn9JLwO4fQ', | |
| 'Example Data', | |
| 'A1:C', | |
| 'SELECT A,B,C WHERE B < 7'); | |
| var rows = result.length;//7 |
ПРФ (в электронных таблицах) - предложение не использовать смешение функций табличных процессоров (ТП). Если разделить функции ТП на хранение, обработку и представление, то можно значительно упростить использование и расширить функционал рабочей модели, которую обслуживает ТП. Самый простой способ достижения этого - использовать правило: "одна функция - один лист". Например, для Таблицы Гугл, которая получает данные из Формы, функцию хранения выполняет лист, привязанный к Форме. Если необходимо как-то модифицировать данные, то необходимо использовать второй лист, для обработки. Если требуется распечатать или вывести на экран в читаемом виде текущие данные, то необходимо использовать третий лист - представление.
Следствием применения принципа является рекомендация не использовать в одном файле (структурной единице р
| https://developers.google.com/apps-script/reference/gmail/gmail-message | |
| https://ctrlq.org/code/20053-save-gmail-to-google-spreadsheet | |
| var SEARCH_QUERY = "label:inbox"; | |
| // Credit: https://gist.github.com/oshliaer/70e04a67f1f5fd96a708 | |
| function getEmails_(q) { | |
| var emails = []; | |
| var threads = GmailApp.search(q); |
| /** | |
| * Gets all the unmerged ranges within a range. | |
| * @param {SpreadsheetApp.Range} range The range to evaluate. | |
| * @returns {SpreadsheetApp.Range[]} The unmerged ranges. | |
| */ | |
| function getUnmergedRanges(range) { | |
| if (!range.isPartOfMerge()) { | |
| return [range]; | |
| } | |
| var mergedRanges = range.getMergedRanges(); |
| # lazyload nvm | |
| # all props goes to http://broken-by.me/lazy-load-nvm/ | |
| # grabbed from reddit @ https://www.reddit.com/r/node/comments/4tg5jg/lazy_load_nvm_for_faster_shell_start/ | |
| lazynvm() { | |
| unset -f nvm node npm npx | |
| export NVM_DIR=~/.nvm | |
| [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" # This loads nvm | |
| if [ -f "$NVM_DIR/bash_completion" ]; then | |
| [ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion |