Идентификатор родительской папки электронной таблицы приложений Google
Источник:
Правильный Код который не подвержен ошибке
Достигнут конец итератора
Exception: Cannot retrieve the next object: iterator has reached the end.
Обсудить:
#DriveApp #SpreadsheetApp
Источник:
var spreadsheetId = SpreadsheetApp.getActiveSpreadsheet().getId();Я еще немного потестил. Вам не обязательно быть владельцем электронной таблицы, но вам нужно иметь разрешение на просмотр или, что лучше, на папку, чтобы получить информацию о папке. Например, если кто-то предоставил вам доступ к электронной таблице, но не к папке, в которой она находится, вы, к сожалению, не сможете получить свойства папки.
var spreadsheetFile = DriveApp.getFileById(spreadsheetId);
var folderId = spreadsheetFile.getParents().next().getId();
Правильный Код который не подвержен ошибке
Достигнут конец итератора
Exception: Cannot retrieve the next object: iterator has reached the end.
function getParentFolder(){
var ss = SpreadsheetApp.getActiveSpreadsheet();
var file = DriveApp.getFileById(ss.getId());
var folders = file.getParents();
while (folders.hasNext()){
Logger.log('folder name = '+folders.next().getName());
Logger.log('folder name = '+folders.next().getId());
}
}
••••••••••Обсудить:
#DriveApp #SpreadsheetApp
Stack Overflow
Google apps spreadsheet parents folder ID
I have a google spreadsheet that is keeping track of the files and their names that are inside the folder where the spreadsheet is.
I have looked and can not find how to get the location or ID of t...
I have looked and can not find how to get the location or ID of t...
Копейка рубль бережет!
var num=123457.12546544
// С округлением
console.log(Math.round((num-Math.trunc(num))*100))
// Без округления#snippet #GAS #JS #customformula
console.log(Math.trunc(num % 1 * 100))
Как создать триггер для запуска программы в назначенное время?
Источник:
Чтобы не терять триггерное время, а оно очень лимитировано для обычных аккаунтов, лучше всего использовать самовоспроизводящийся триггер
runOnce - это то, что вы должны запустить один раз при первом запуске вашего триггера. Другие настройки не требуются
trigger_ - это и триггер и конфигурация вашего триггера
Такой триггер выполняется с высокой степенью точности, погрешность часто составляет меньше половины секунды.
••••••••••
Обсудить:
#JS #GAS #triggers
Источник:
Чтобы не терять триггерное время, а оно очень лимитировано для обычных аккаунтов, лучше всего использовать самовоспроизводящийся триггер
/**
* это то, что вы должны запустить один раз при первом запуске вашего триггера.
* Другие настройки не требуются
*/
function runOnce() {
trigger_();
}
/**
* это и триггер и конфигурация вашего триггера
*/
function trigger_() {
try {
triggerAction();
} catch (error) {
console.error(error.message, error);
} finally {
var hours = 10;
var minutes = 17;
var seconds = 56;
var now = new Date();
var nextTime = new Date();
nextTime.setHours(0, 0, 24 * 3600 + hours * 3600 + minutes * 60 + seconds);
var delta = nextTime.getTime() - now.getTime();
ScriptApp.newTrigger('trigger_')
.timeBased()
.after(delta)
.create();
}
}
/**
* это то, что выполняет ваш скрипт
*/
function triggerAction() {
console.log("I'm fine");
}
triggerAction - это то, что выполняет ваш скриптrunOnce - это то, что вы должны запустить один раз при первом запуске вашего триггера. Другие настройки не требуются
trigger_ - это и триггер и конфигурация вашего триггера
Такой триггер выполняется с высокой степенью точности, погрешность часто составляет меньше половины секунды.
••••••••••
Обсудить:
#JS #GAS #triggers
Хабр Q&A — вопросы и ответы
Как создать триггер для запуска программы в назначенное время?
Оцените ответ от oshliaer. Чтобы не терять триггерное время, а оно очень лимитировано для обычных аккаунтов, лучше всего использовать самовоспроизводящийся триггер
/**
*
*/
function runOnce() {
trigger_();
}
/**
*
*/
function trigger_() {
try {…
/**
*
*/
function runOnce() {
trigger_();
}
/**
*
*/
function trigger_() {
try {…
Облегчение функции IMPORTRANGE v.2.0
Источник:
При связи двух и более таблиц с помошью формулы importrange - при переходе определенного порога нагрузки (зависит от количества импортируемых ячеек а так же от количества символов в ячейках) мы сталкиваемся с ошибкой импорта, когда данные просто не импортируются или импортируются не всегда. Работать с данными становится проблематично. Для решения этой проблемы можно использовать следующий метод облегчения функции IMPORTRANGE. Метод позволяет импортировать примерно в 2 раза больше данных.
Суть метода состоит в 2-х аспектах:
1. Мы с помощью формулы импортируем ровно столько строк, сколько необходимо для импорта, не более того
2. Мы многократно уменьшаем количество импортируемых ячеек при том же количестве информации - с помощью сжатия данных до одного столбца.
На примере двух вкладок "импортируемые данные" и "экспорт" продемонстируем метод, действия описаны ниже:
#formula
Источник:
При связи двух и более таблиц с помошью формулы importrange - при переходе определенного порога нагрузки (зависит от количества импортируемых ячеек а так же от количества символов в ячейках) мы сталкиваемся с ошибкой импорта, когда данные просто не импортируются или импортируются не всегда. Работать с данными становится проблематично. Для решения этой проблемы можно использовать следующий метод облегчения функции IMPORTRANGE. Метод позволяет импортировать примерно в 2 раза больше данных.
Суть метода состоит в 2-х аспектах:
1. Мы с помощью формулы импортируем ровно столько строк, сколько необходимо для импорта, не более того
2. Мы многократно уменьшаем количество импортируемых ячеек при том же количестве информации - с помощью сжатия данных до одного столбца.
На примере двух вкладок "импортируемые данные" и "экспорт" продемонстируем метод, действия описаны ниже:
#formula
Google Docs
Облегчение функции IMPORTRANGE v.2.0
справка
При связи двух и более таблиц с помошью формулы importrange - при переходе определенного порога нагрузки (зависит от количества импортируемых ячеек а так же от количества символов в ячейках) мы сталкиваемся с ошибкой импорта, когда данные просто…
При связи двух и более таблиц с помошью формулы importrange - при переходе определенного порога нагрузки (зависит от количества импортируемых ячеек а так же от количества символов в ячейках) мы сталкиваемся с ошибкой импорта, когда данные просто…
Change queue time of Google spreadsheet app script trigger
Источник:
Ask Question
Если точность имеет первостепенное значение, вы можете вообще отказаться от использования триггеров сценариев приложений и вместо этого использовать сторонний инструмент.
Я бы рекомендовал использовать cron-job.org . Эта служба может создавать задания cron, которые отправляют запросы POST на указанную вами конечную точку URL, и вы можете планировать время с точностью до минуты. Чтобы использовать его с Apps Script, реализуйте a doPost()для обработки почтовых запросов и развертывания вашего скрипта как веб-приложения. Затем вы создаете задание cron с помощью службы и передаете ему URL-адрес веб-приложения в качестве конечной точки.
Задание cron запускается в запланированное время, и вы можете выполнять любые необходимые операции внутри doPost()в ответ на входящий запрос POST.
Спасибо случайным деталям и Dimu Designs за руководство. На основе экспериментов вот ответы на мои вопросы:
Возможно ли, кроме наблюдения за ежедневной обработкой, определить точное время выполнения триггера, которое было назначено? Ответ: Ни в коем случае, кроме как путем наблюдения случайного времени запуска, назначенного в пределах запрошенного часового окна.
При случайном назначении можно ли создавать и удалять триггеры сценария, пока не будет получено приемлемо точное время выполнения? Ответ: Да. Я скорректировал назначенное мне время выполнения сценария, наблюдая за временем выполнения триггера (через временную метку сообщения электронной почты), а также удаляя, воссоздавая и наблюдая за случайно назначенным временем выполнения триггера, пока не получу приемлемую минуту в пределах запрошенного часового окна.
••••••••••
смотрите также
Обсудить:
#triggers #webapp
Источник:
Ask Question
Если точность имеет первостепенное значение, вы можете вообще отказаться от использования триггеров сценариев приложений и вместо этого использовать сторонний инструмент.
Я бы рекомендовал использовать cron-job.org . Эта служба может создавать задания cron, которые отправляют запросы POST на указанную вами конечную точку URL, и вы можете планировать время с точностью до минуты. Чтобы использовать его с Apps Script, реализуйте a doPost()для обработки почтовых запросов и развертывания вашего скрипта как веб-приложения. Затем вы создаете задание cron с помощью службы и передаете ему URL-адрес веб-приложения в качестве конечной точки.
Задание cron запускается в запланированное время, и вы можете выполнять любые необходимые операции внутри doPost()в ответ на входящий запрос POST.
Спасибо случайным деталям и Dimu Designs за руководство. На основе экспериментов вот ответы на мои вопросы:
Возможно ли, кроме наблюдения за ежедневной обработкой, определить точное время выполнения триггера, которое было назначено? Ответ: Ни в коем случае, кроме как путем наблюдения случайного времени запуска, назначенного в пределах запрошенного часового окна.
При случайном назначении можно ли создавать и удалять триггеры сценария, пока не будет получено приемлемо точное время выполнения? Ответ: Да. Я скорректировал назначенное мне время выполнения сценария, наблюдая за временем выполнения триггера (через временную метку сообщения электронной почты), а также удаляя, воссоздавая и наблюдая за случайно назначенным временем выполнения триггера, пока не получу приемлемую минуту в пределах запрошенного часового окна.
••••••••••
смотрите также
Обсудить:
#triggers #webapp
Stack Overflow
Change queue time of Google spreadsheet app script trigger
When I create a daily time-based trigger for the Google app script associated with my Google spreadsheet, I am prompted to select an execution time that is within an hour-long window, and it appear...
Forwarded from DidacticСardsBot
XPath Tester using Web Apps Created by Google Apps Script
Источник:
В этом посте я хотел бы представить тестер xpath, использующий веб-приложения, созданные с помощью скрипта Google Apps.
Применение
1. Подготовьте таблицу Google.
Создайте новую таблицу Google на своем Google Диске.
2. Включите API Таблиц.
Откройте редактор сценариев в созданной новой электронной таблице и включите API таблиц в расширенных службах Google .
3. Подготовьте образец сценария.
Скопируйте и вставьте следующий скрипт в редактор скриптов в созданную новую электронную таблицу и сохраните его.
4. Разверните веб-приложения
Выберите «Я» для «Выполнить как» .
Пожалуйста , выберите «Любой» для «Кто имеет доступ»
С помощью этого параметра любой может получить доступ к вашим веб-приложениям. В данном случае это для тестирования этого скрипта.
Конечно, вы можете использовать токен доступа в этой ситуации. Но в этом случае в качестве простой настройки я использую ключ доступа вместо токена доступа.
Скопируйте URL-адрес веб-приложения. Это как https://script.google.com/macros/s/###/exec.
После изменения скрипта Google Apps повторно разверните его как новую версию. Таким образом, измененный сценарий отражается в веб-приложениях. Пожалуйста, будьте осторожны.
5. Тестирование.
Например, когда xpath обнаруживает ошибку, возвращается следующий результат.
$ curl -L 'https://script.google.com/macros/s/###/exec?url=https://tanaikech.github.io/index.xml&xpath=//channel/sample'
{
"url": "https://tanaikech.github.io/index.xml",
"xpath": "//channel/sample",
"values": [["#N/A"]],
"error": { "type": "N_A", "message": "Imported content is empty." }
}
••••••••••
Обсудить:
Источник:
В этом посте я хотел бы представить тестер xpath, использующий веб-приложения, созданные с помощью скрипта Google Apps.
Применение
1. Подготовьте таблицу Google.
Создайте новую таблицу Google на своем Google Диске.
2. Включите API Таблиц.
Откройте редактор сценариев в созданной новой электронной таблице и включите API таблиц в расширенных службах Google .
3. Подготовьте образец сценария.
Скопируйте и вставьте следующий скрипт в редактор скриптов в созданную новую электронную таблицу и сохраните его.
function doGet(e) {
const url = e.parameter.url;
const xpath = e.parameter.xpath;
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheets()[0];
sheet.clear();
const range = sheet.getRange("A1");
range.setFormula(`=IMPORTXML("${url}";"${xpath}")`);
do {
SpreadsheetApp.flush();
Utilities.sleep(1000);
} while (range.getDisplayValue() == "Loading...");
const values = sheet.getDataRange().getDisplayValues();
const res = { url: url, xpath: xpath, values: values };
if (values[0][0] == "#N/A") {
const obj = Sheets.Spreadsheets.get(ss.getId(), {
ranges: [sheet.getSheetName()],
fields: "sheets",
});
const v = obj.sheets[0].data[0].rowData[0].values[0];
if (
v.hasOwnProperty("effectiveValue") &&
v.effectiveValue.hasOwnProperty("errorValue")
) {
res.error = v.effectiveValue.errorValue;
}
}
sheet.clear();
return ContentService.createTextOutput(JSON.stringify(res)).setMimeType(
ContentService.MimeType.JSON
);
}4. Разверните веб-приложения
Выберите «Я» для «Выполнить как» .
Пожалуйста , выберите «Любой» для «Кто имеет доступ»
С помощью этого параметра любой может получить доступ к вашим веб-приложениям. В данном случае это для тестирования этого скрипта.
Конечно, вы можете использовать токен доступа в этой ситуации. Но в этом случае в качестве простой настройки я использую ключ доступа вместо токена доступа.
Скопируйте URL-адрес веб-приложения. Это как https://script.google.com/macros/s/###/exec.
После изменения скрипта Google Apps повторно разверните его как новую версию. Таким образом, измененный сценарий отражается в веб-приложениях. Пожалуйста, будьте осторожны.
5. Тестирование.
Например, когда xpath обнаруживает ошибку, возвращается следующий результат.
$ curl -L 'https://script.google.com/macros/s/###/exec?url=https://tanaikech.github.io/index.xml&xpath=//channel/sample'
{
"url": "https://tanaikech.github.io/index.xml",
"xpath": "//channel/sample",
"values": [["#N/A"]],
"error": { "type": "N_A", "message": "Imported content is empty." }
}
••••••••••
Обсудить:
Forwarded from volond
https://xfanatical.com/blog/print-google-sheet-as-pdf-using-apps-script/
Возможные улучшения:
Экспорт листов как отделных таблиц Google или xlsx
Оправка через Gmail/Телеграмм/Вайбер
Генерация имени по шаблонным правилам
#GAS #SheetAPI #export #PDF
Возможные улучшения:
Экспорт листов как отделных таблиц Google или xlsx
Оправка через Gmail/Телеграмм/Вайбер
Генерация имени по шаблонным правилам
#GAS #SheetAPI #export #PDF
xFanatical
How to Print Google Sheet to PDF Using Apps Script | xFanatical
Automate printing Google Sheets to PDF using Apps Script. Follow this simple tutorial to generate, customize and download PDFs effortlessly.
Объединить несколько PDF-файлов в один PDF-файл
Источник:
Задать вопрос
У меня такая же проблема, и я временно использую RestFul API для слияния PDF-файлов:
https://www.convertapi.com/pdf-to-merge
Я использовал эту информацию, чтобы написать сценарий, достаточный для моих нужд. Однако он не учитывает все возможности, поэтому, в частности, слияние любых документов, требующих PDF-1.4 и выше, потребует довольно большой работы.
https://pastiebin.com/601c57a966040
••••••••••
Обсудить:
Источник:
Задать вопрос
У меня такая же проблема, и я временно использую RestFul API для слияния PDF-файлов:
https://www.convertapi.com/pdf-to-merge
function merge() {
var folder = DriveApp.getFolderById('<ID FOLDER>'); // folder with files pdf
var files = folder.getFiles(); // get all files pdf
var formData = {};
var index = 0;
while(files.hasNext()) {
var file = files.next();
formData['Files[' + index + ']'] = file.getBlob();
index++;
}
var options = {
'method' : 'post',
'payload' : formData,
'muteHttpExceptions': true
};
var response = UrlFetchApp.fetch('https://v2.convertapi.com/pdf/to/merge?Secret=<YOUR SECRET>', options);
if(response.getResponseCode() == 200) {
var contentText = JSON.parse(response.getContentText());
var blob = Utilities.base64Decode(contentText.Files[0].FileData);
folder.createFile(Utilities.newBlob(blob, 'application/pdf', 'merge.pdf'));
}
}
Так что это больше, чем просто объединение данных из каждого файла. Фактически используемые данные для каждого файла «упакованы» с пометками и другим кодом (аналогично HTML и другим форматам документов). Фактически вам нужно декодировать каждый PDF-файл, объединить необходимые части, а затем перекодировать с новой «упаковкой». Для этого требуется практическое знание спецификаций и структуры PDF-файла, который можно бесплатно получить в Adobe здесь .Я использовал эту информацию, чтобы написать сценарий, достаточный для моих нужд. Однако он не учитывает все возможности, поэтому, в частности, слияние любых документов, требующих PDF-1.4 и выше, потребует довольно большой работы.
https://pastiebin.com/601c57a966040
••••••••••
Обсудить:
Stack Overflow
Merge Multiple PDF's into one PDF
I am having some issues with my code. I am trying to loop through a Drive folder that contains many PDFs and then merge these into one file. When I use my code it just creates a PDF for the last PD...
Forwarded from DidacticСardsBot
Номер телефона
Источник:
Регулярное выражение для валидации номера телефона:
^((8|\+7)[\- ]?)?(\(?\d{3}\)?[\- ]?)?[\d\- ]{7,10}$
Ориентировано на российские мобильные + городские с кодом из 3 цифр (например, Москва).
Зеленый свет для:
+79261234567
89261234567
79261234567
+7 926 123 45 67
8(926)123-45-67
123-45-67
9261234567
79261234567
(495)1234567
(495) 123 45 67
89261234567
8-926-123-45-67
8 927 1234 234
8 927 12 12 888
8 927 12 555 12
8 927 123 8 123
••••••••••
Обсудить:
Источник:
Регулярное выражение для валидации номера телефона:
^((8|\+7)[\- ]?)?(\(?\d{3}\)?[\- ]?)?[\d\- ]{7,10}$
Ориентировано на российские мобильные + городские с кодом из 3 цифр (например, Москва).
Зеленый свет для:
+79261234567
89261234567
79261234567
+7 926 123 45 67
8(926)123-45-67
123-45-67
9261234567
79261234567
(495)1234567
(495) 123 45 67
89261234567
8-926-123-45-67
8 927 1234 234
8 927 12 12 888
8 927 12 555 12
8 927 123 8 123
••••••••••
Обсудить:
Хабр
Номер телефона
Регулярное выражение для валидации номера телефона: ^((8|\+7)[\- ]?)?(\(?\d{3}\)?[\- ]?)?[\d\- ]{7,10}$ Ориентировано на российские мобильные + городские с код...
Forwarded from DidacticСardsBot
Отображение данных из GitHub API в Google Таблицах с помощью Apps Script и Oauth
Источник:
В этом посте показано, как подключить Google Sheet к API GitHub с помощью Oauth и Apps Script. Цель состоит в том, чтобы получить данные и информацию из GitHub и отобразить их в вашей таблице Google для дальнейшего анализа и визуализации.
Если вы управляете командой разработчиков или являетесь техническим менеджером проекта, то это может быть действительно полезным способом анализа и визуализации статистики кодирования вашей команды или проекта в сравнении с целями, такими как количество коммитов, языки, вовлеченные люди и т. Д. С течением времени. .
••••••••••
Обсудить:
Источник:
В этом посте показано, как подключить Google Sheet к API GitHub с помощью Oauth и Apps Script. Цель состоит в том, чтобы получить данные и информацию из GitHub и отобразить их в вашей таблице Google для дальнейшего анализа и визуализации.
Если вы управляете командой разработчиков или являетесь техническим менеджером проекта, то это может быть действительно полезным способом анализа и визуализации статистики кодирования вашей команды или проекта в сравнении с целями, такими как количество коммитов, языки, вовлеченные люди и т. Д. С течением времени. .
••••••••••
Обсудить:
Benlcollins
Show data from GitHub's API in Google Sheets, with Apps Script & Oauth
How to connect a Google Sheet to GitHub's API with Oauth and Apps Script, to build spreadsheet applications to analyze your coding data.
function ins(){
var ss= SpreadsheetApp.getActive()
var sheet=ss.getActiveSheet()
var data=sheet.getDataRange().getValues()
for (i=data.length;i>1;i--){
console.log(i)
sheet.insertRowsAfter(i, 1);
}
}
function insAndCopy(){
var ss= SpreadsheetApp.getActive()
var sheet=ss.getActiveSheet()
var data=sheet.getDataRange().getValues()
for (i=data.length;i>1;i--){
var range = sheet.getRange(i,1,1,data[0].length);
sheet.insertRowsAfter(i, 1);
range.copyTo(sheet.getRange(i+1, 1, 1, data[0].length), {contentsOnly:false});
range.copyFormatToRange(sheet.getRange(i+1, 1, 1, data[0].length), {contentsOnly:false});
}
}JavaScript-массивы: пересечение, разность и объединение в ES6
Источник:
Пересечение даст нам элементы, которые объединяют оба массива, в этом случае результат должен быть [1,5].
Источник:
Пересечение даст нам элементы, которые объединяют оба массива, в этом случае результат должен быть [1,5].
let intersection = arrA.filter(x => arrB.includes(x));Разность будет выводить элементы из массива A, которых нет в массиве B. Результат будет [3,4].
let difference = arrA.filter(x => !arrB.includes(x));В этом случае вы получите массив, содержащий все элементы arrA, которых нет в arrB, и наоборот, так что результат должен быть [2,3,4,6,7].
let difference = arrA.filter(x => !arrB.includes(x)).concat(arrB.filter(x => !arrA.includes(x)));Объединение должно быть самым простым из них всех, в конце концов, результатом должны быть все элементы из A, все из B или оба, как это [1,2,3,4,5,6,7].
let union = [...arrA, ...arrB];Но есть проблема в том, что мы получим дублированные элементы, так что теоретически это не объединение. Для этого мы можем использовать new Set():
let union = [...new Set([...arrA, ...arrB)];••••••••••
Google Apps Script - новый день - новая функция
Источник:
Наряду с сервисом контента, теперь вы можете получить закодированную jSon версию скрипта любого модуля.
Я реализую это для сайтов Google и в других местах и опубликую здесь позже с результатами. Больше не нужно поддерживать исходный код в виде Gist и Apps Script!
••••••••••
Обсудить:
#GAS #ScriptApp
Источник:
Наряду с сервисом контента, теперь вы можете получить закодированную jSon версию скрипта любого модуля.
function doGet(e) {
return ContentService
.createTextOutput(JSON.stringify(mcpher.getMySource ( e )))
.setMimeType(ContentService.MimeType.JSON); ;
}
Код , который на это реагирует:/**
* Returns a modules source code
* @param {parameters} e the argument to doGet(e). should have module parameter specified
* @param {scriptappinstance} sap an instance of scriptapp
* @return {object} The result.
*/
function getMySource(e) {
var results = {error : "missing module parameter"};
if (e.hasOwnProperty("parameter")) {
if (e.parameter.module) {
try {
var results =
{ code :
{ module : e.parameter.module, code : ScriptApp.getResource(e.parameter.module).getDataAsString() }
};
}
catch (err) {
var results = { error : "could not open module " + e.parameter.module} ;
}
}
}
return results;
}
function testGetSource() {
Logger.log( getMySource ( {parameter: { module: "cRest" }}));
}
Попробуйте и убедитесь. Итак, теперь вы можете получить исходный код любого модуля, создав doGet (), как указано выше, и скопировав код getMySource.Я реализую это для сайтов Google и в других местах и опубликую здесь позже с результатами. Больше не нужно поддерживать исходный код в виде Gist и Apps Script!
••••••••••
Обсудить:
#GAS #ScriptApp
Desktop Liberation
Google Apps Script - a new day - a new feature - Desktop Liberation
Desktop Liberation and its related blog and G+ community aims to help you use cloud based APIS and services without being constrained by your desktop
Forwarded from DidacticСardsBot
Function.caller
Источник:
Не стандартно
Эта возможность не является стандартной и стандартизировать её пока никто не собирается. Не используйте её на сайтах, смотрящих во внешний мир: она будет работать не у всех пользователей. Также могут присутствовать большие несовместимости между реализациями и её поведение может в будущем измениться.
••••••••••
Обсудить:
Источник:
Не стандартно
Эта возможность не является стандартной и стандартизировать её пока никто не собирается. Не используйте её на сайтах, смотрящих во внешний мир: она будет работать не у всех пользователей. Также могут присутствовать большие несовместимости между реализациями и её поведение может в будущем измениться.
function myFunc() {
if (myFunc.caller == null) {
return 'Эта функция была вызвана из верхнего уровня!';
} else {
return 'Эта функция была вызвана из ' + myFunc.caller;
}
}••••••••••
Обсудить:
MDN Web Docs
Function.caller - JavaScript | MDN
Свойство function.caller возвращает функцию, которая вызвала указанную функцию.
Object.assign VS Object Spread
Источник:
похож на оператор Object.assign(), так какой из них следует использовать?
Оказывается, ответ немного более подробный, чем вы могли ожидать.
Краткий обзор Object Spread
Различия в сравнении Object.assign()
Операторы покоя / распространения объекта синтаксически аккуратны и предлагают преимущества в производительности Object.assign(). Если вы используете Node.js 8 или выше, попробуйте эти новые операторы и сделайте свой код более лаконичным.
••••••••••
Обсудить:
Источник:
var assingDestruction(){
const obj = { foo: 1, bar: 1 };
console.log({ ...obj, baz: 1 })
}
Оператор распространения объекта {...obj}похож на оператор Object.assign(), так какой из них следует использовать?
Оказывается, ответ немного более подробный, чем вы могли ожидать.
Краткий обзор Object Spread
Различия в сравнении Object.assign()
Операторы покоя / распространения объекта синтаксически аккуратны и предлагают преимущества в производительности Object.assign(). Если вы используете Node.js 8 или выше, попробуйте эти новые операторы и сделайте свой код более лаконичным.
••••••••••
Обсудить:
The Code Barbarian
Object.assign vs Object Spread in Node.js
JavaScript's Object.assign() function is similar to the spread operator `...`. Which one should you use?
Краткий обзор Object Spread
Источник:
Основная идея оператора распространения объекта - создать новый простой объект,
используя собственные свойства существующего объекта.
Таким образом
{...obj}
создается новый объект с теми же свойствами и значениями, что и obj.
Для простых старых объектов JavaScript вы по сути создаете копию obj.
Это делает копирование символов ES6 .
Порядок имеет значение:
оператор распространения объекта перезапишет свойства, определенные до него, но не после него.
const obj = { a: 'a', b: 'b', c: 'c' };
{ a: 1, b: null, c: void 0, ...obj }; // { a: 'a', b: 'b', c: 'c' }
{ a: 1, b: null, ...obj, c: void 0 }; // { a: 'a', b: 'b', c: undefined }
{ a: 1, ...obj, b: null, c: void 0 }; // { a: 'a', b: null, c: undefined }
{ ...obj, a: 1, b: null, c: void 0 }; // { a: 1, b: null, c: undefined }
••••••••••
Обсудить:
Источник:
Основная идея оператора распространения объекта - создать новый простой объект,
используя собственные свойства существующего объекта.
Таким образом
{...obj}
создается новый объект с теми же свойствами и значениями, что и obj.
Для простых старых объектов JavaScript вы по сути создаете копию obj.
const obj = { foo: 'bar' };
const clone = { ...obj }; // `{ foo: 'bar' }`
obj.foo = 'baz';
clone.foo; // 'bar'
Например Object.assign(), оператор распространения объекта не копирует унаследованные свойства или информацию о классе.Это делает копирование символов ES6 .
class BaseClass {
foo() { return 1; }
}
class MyClass extends BaseClass {
bar() { return 2; }
}
const obj = new MyClass();
obj.baz = function() { return 3; };
obj[Symbol.for('test')] = 4;
// Does _not_ copy any properties from `MyClass` or `BaseClass`
const clone = { ...obj };
console.log(clone); // { baz: [Function], [Symbol(test)]: 4 }
console.log(clone.constructor.name); // Object
console.log(clone instanceof MyClass); // false
Вы также можете смешивать другие свойства с оператором распространения объекта. Порядок имеет значение:
оператор распространения объекта перезапишет свойства, определенные до него, но не после него.
const obj = { a: 'a', b: 'b', c: 'c' };
{ a: 1, b: null, c: void 0, ...obj }; // { a: 'a', b: 'b', c: 'c' }
{ a: 1, b: null, ...obj, c: void 0 }; // { a: 'a', b: 'b', c: undefined }
{ a: 1, ...obj, b: null, c: void 0 }; // { a: 'a', b: null, c: undefined }
{ ...obj, a: 1, b: null, c: void 0 }; // { a: 1, b: null, c: undefined }
••••••••••
Обсудить:
The Code Barbarian
Object.assign vs Object Spread in Node.js
JavaScript's Object.assign() function is similar to the spread operator `...`. Which one should you use?
Различия в сравнении Object.assign()
Источник:
Функция Object.assign() по сути взаимозаменяема с оператором распространения объекта для приведенных выше примеров.
Фактически, в спецификации распространения объекта явно указано, что
{ ...obj } это эквивалентно Object.assign({}, obj).
Одно из ключевых отличий заключается в том, что оператор распространения объекта
всегда возвращает вам POJO.
Object.assign()Функция изменяет свой первый параметр на месте:
модифицирует объект на месте и может запускать сеттеры ES6 .
Если вы предпочитаете использовать неизменяемые методы, явным победителем станет оператор распространения объекта.
С Object.assign(), вам нужно будет убедиться, что вы всегда передаете пустой объект {}в качестве первого аргумента.
Еще одно связанное отличие состоит в том,
что распространение
определяет новые свойства,
Object.assign()
устанавливает их .
Например, Object.assign()вызывает
сеттеры ,
которые определены Object.prototype, а оператор распространения - нет.
Вот пара простых тестов. Похоже, что распространение объекта происходит быстрее, если вы передаете пустой объект в качестве первого параметра Object.assign(), но в остальном они взаимозаменяемы.
Вот эталон, использующийся Object.assign()с назначением на месте:
Обсудить:
Источник:
Функция Object.assign() по сути взаимозаменяема с оператором распространения объекта для приведенных выше примеров.
Фактически, в спецификации распространения объекта явно указано, что
{ ...obj } это эквивалентно Object.assign({}, obj).
const obj = { a: 'a', b: 'b', c: 'c' };
Object.assign({ a: 1, b: null, c: void 0 }, obj); // { a: 'a', b: 'b', c: 'c' }
Object.assign({ a: 1, b: null }, obj, { c: void 0 }); // { a: 'a', b: 'b', c: undefined }
Object.assign({ a: 1 }, obj, { b: null, c: void 0 }); // { a: 'a', b: null, c: undefined }
Object.assign({}, obj, { a: 1, b: null, c: void 0 }); // { a: 1, b: null, c: undefined }
Так почему бы вам использовать то или другое? Одно из ключевых отличий заключается в том, что оператор распространения объекта
всегда возвращает вам POJO.
Object.assign()Функция изменяет свой первый параметр на месте:
class MyClass {
set val(v) {
console.log('Setter called', v);
return v;
}
}
const obj = new MyClass();
Object.assign(obj, { val: 42 }); // Prints "Setter called 42"
Другими словами, Object.assign()модифицирует объект на месте и может запускать сеттеры ES6 .
Если вы предпочитаете использовать неизменяемые методы, явным победителем станет оператор распространения объекта.
С Object.assign(), вам нужно будет убедиться, что вы всегда передаете пустой объект {}в качестве первого аргумента.
Еще одно связанное отличие состоит в том,
что распространение
определяет новые свойства,
Object.assign()
устанавливает их .
Например, Object.assign()вызывает
сеттеры ,
которые определены Object.prototype, а оператор распространения - нет.
Object.defineProperty(Object.prototype, 'myProp', {
set: () => console.log('Setter called');
});
const obj = { myProp: 42 };
Object.assign({}, obj); // Prints "Setter called"
const newObj = { ..obj }; // Does **not** print "Setter called"
Это довольно незначительная разница, потому что, как правило, определять собственный сеттер - плохая практика Object.prototype. Но вы должны отметить, что Object.assign()вызывает сеттеры для целевого объекта.const obj = {};
Object.defineProperty(obj, 'myProp', {
set: () => console.log('Setter called');
});
Object.assign(obj, { myProp: 42 }); // Prints "Setter called"
А как насчет производительности? Вот пара простых тестов. Похоже, что распространение объекта происходит быстрее, если вы передаете пустой объект в качестве первого параметра Object.assign(), но в остальном они взаимозаменяемы.
Вот эталон, использующийся Object.assign()с назначением на месте:
const Benchmark = require('benchmark');
const suite = new Benchmark.Suite;
const obj = { foo: 1, bar: 2 };
suite.
add('Object spread', function() {
({ baz: 3, ...obj });
}).
add('Object.assign()', function() {
Object.assign({ baz: 3 }, obj);
}).
on('cycle', function(event) {
console.log(String(event.target));
}).
on('complete', function() {
console.log('Fastest is ' + this.filter('fastest').map('name'));
}).
run({ 'async': true });
В этом случае они похожи:Object spread x 3,170,111 ops/sec +-1.50% (90 runs sampled)Однако, как только вы добавляете пустой параметр Object.assign()объекта, оператор распространения объекта будет работать быстрее:
Object.assign() x 3,290,165 ops/sec +-1.86% (88 runs sampled)
Fastest is Object.assign()
suite.Вот результат:
add('Object spread', function() {
({ baz: 3, ...obj });
}).
add('Object.assign()', function() {
Object.assign({}, obj, { baz: 3 });
})
Object spread x 3,065,831 ops/sec +-2.12% (85 runs sampled)••••••••••
Object.assign() x 2,461,926 ops/sec +-1.52% (88 runs sampled)
Fastest is Object spread
Обсудить:
The Code Barbarian
Object.assign vs Object Spread in Node.js
JavaScript's Object.assign() function is similar to the spread operator `...`. Which one should you use?
Имеем:
Ось Win 10
VS CODE
NodeJS
Clasp
Git
Требуеться начать работатать с
https://github.com/hedgehogsburrows/empty-google-apps-script-project
Ось Win 10
VS CODE
NodeJS
Clasp
Git
Требуеться начать работатать с
https://github.com/hedgehogsburrows/empty-google-apps-script-project
GitHub
GitHub - hedgehogsburrows/empty-google-apps-script-project
Contribute to hedgehogsburrows/empty-google-apps-script-project development by creating an account on GitHub.