Я новичок в скриптах Google Sheets и не могу понять, почему я получаю эту ошибку: диапазон не найден (строка 4, файл «Код»). Я следил за всем из https://developers.google.com/apps-script/guides/sheets/functions
function getBgColor(input)
Я ценю всю помощь.
user4592633 20 мар ’15 в 05:30 2015-03-20 05:30
2015-03-20 05:30
1 ответ
Ваш код должен быть в порядке, если ваш диапазон ввода — только одна ячейка, по крайней мере, если вы передаете его в виде строки. = GetBgColor(«D1»). Однако, если вы хотите передать диапазон, я думаю, что вам придется зацикливаться на этом диапазоне, чтобы получить цвета всего диапазона. Так что вам нужно что-то вроде этого (не проверено):
function getBgColor(input) < var bgs = SpreadsheetApp.getActiveSheet().getRange(input).getBackgrounds(), colors = []; for(var i = 0; i < bgs.length; i++)< colors.push(bgs[i]); >return colors; >
Это должно дать вам диапазон со всеми фоновыми цветами диапазона, который вы передали. Если вы хотите, чтобы эти цвета находились в одной ячейке, используйте: return colors.join(«, «). Если вы хотите вернуть только уникальные цвета, есть также способы сделать это..
Избирательный импорт данных в Гугл.таблицах
Посмотрите, поможет ли это в первую очередь?
Источник: stackru.com
Таблицы Google: диапазон не найден
Я новичок в скриптах Google Таблиц, и я не могу понять, почему я получаю эту ошибку: Range not found (строка 4, файл «Код»). Я следил за всем: https://developers.google.com/apps-script/guides/sheets/functions#creating_a_custom_function Вот мой код:
function getBgColor(input) var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheets()[0];
var range = sheet.getRange(input);
return range.getBackground();
>
Я ценю всю помощь.
спросил(а) 2020-03-03T19:27:49+03:00 3 года, 4 месяца назад
добавить комментарий
пожаловаться
Ваш код должен быть хорошим, если ваш диапазон ввода — это только одна ячейка, по крайней мере, если вы передадите ее в виде строки. = GetBgColor ( «D1»). Однако, если вы хотите пройти в диапазоне, я думаю, вам придется зацикливаться на этом диапазоне, чтобы получить цвета всего диапазона. Итак, вам понадобится что-то вроде этого (untested):
function getBgColor(input) var bgs = SpreadsheetApp.getActiveSheet().getRange(input).getBackgrounds(),
colors = [];
for(var i = 0; i < bgs.length; i++)colors.push(bgs[i]);
>
return colors;
>
Это должно дать вам диапазон со всеми фоновыми цветами диапазона, который вы передали. Если вам нужны эти цвета в одной ячейке, используйте: return colors.join(«,»). Если вы хотите вернуть только уникальные цвета, есть также способы сделать это. Посмотрите, поможет ли это в первую очередь?
Источник: progi.pro
Гугл таблицы.Как сделать накопительный результат в динамическом диапазоне. Лайфхаки Google Sheets.
Ошибка скрипта Google Apps getRange (): диапазон не найден
Я чувствую, что я об этом не так. Я пытаюсь автоматизировать часть моей рабочей нагрузки здесь. Я очищаю электронные таблицы с четырьмя столбцами (AE), 2000+. Столбец B содержит URL-адреса веб-сайтов, столбец D содержит имя бизнес-адреса URL, сгенерированное из другого источника.
Иногда инструмент не захватывает имя правильно или имя отсутствует, поэтому он заполняет недостающие записи в столбце D «——» (6 дефисов). Я пытаюсь сделать функцию, которая принимает входную ячейку, проверяет, является ли содержимое ячейки «——«, и если она является функцией, изменяет содержимое входной ячейки на содержимое ячейку два столбца слева (что обычно является URL-адресом веб-сайта). Это то, что я придумал.
function replaceMissing(input) < var sheet = SpreadsheetApp.getActiveSheet(); //sets active range to the input cell var cell = sheet.getRange(‘»‘ + input + ‘»‘); //gets cell to fill input cell var urlCell = sheet.getRange(cell.getRow(), cell.getColumn() — 2); //gets contents of input cell as String var data = cell.getValue(); //gets contents of urlCell as String var data2 = cell.getValue(); //checks if input cell should be replaced if (data === «——«) < //set current cell value to the value of the cell 2 columns to the left cell.setValue(data2); >>
Когда я пытаюсь использовать свою функцию в своем листе, ячейка возвращает ошибку
Error Range not found (line 4).
Я предполагаю, что на основе подобных вопросов люди спрашивали, что именно так вы используете A1-функцию функции с аргументом. Однако, похоже, это не так, поэтому я застрял. Я также не думаю, что мое решение очень хорошее.
rhl13 13 авг. 2017, в 02:06
Поделиться
Я не согласен с опубликованным ответом относительно производительности или лучшего решения, но ошибка, которую вы получаете, заключается в том, что «вход» не определен. Инициализация var cell = sheet.getActiveCell (); позволит избежать ошибки. Также вы намеревались написать код var data2 = urlCell.getValue (); Я попробовал это с этими изменениями, и это сработало.
Jeremy Kahan 13 авг. 2017, в 11:41
Вам нужно будет дать разрешение сценарию на установку значений (в том, что я сказал в предыдущем комментарии).
Jeremy Kahan 13 авг. 2017, в 12:27
Альтернативой, позволяющей избежать сценариев, является то, что если вы не возражаете против введения другого столбца, если у вас есть заголовки в строке 1, а ваши данные начинаются со строки 2, вы можете поставить = if (D2 = «——«, B2, D2 ) в свободном столбце в строке 2 и полностью скопируйте формулу. Затем вы можете скрыть столбец D, если хотите.
Jeremy Kahan 13 авг. 2017, в 14:06
Показать ещё 1 комментарий
Поделиться:
google-apps-script
google-sheets
1 ответ
Лучший ответ
1) Он несколько неоднозначен в документации по ГАЗ, но пользовательские функции имеют немало ограничений. Они лучше подходят для сценариев, где вам нужно выполнить простой расчет и вернуть в ячейку строку или числовое значение. Хотя пользовательские функции могут вызывать некоторые услуги GAS, эта практика сильно не поощряется Google.
Если вы проверите документы для списка поддерживаемых сервисов, вы заметите, что они поддерживают только некоторые методы get для службы Spreadsheet, но не «устанавливают» методы https://developers.google.com/apps-script/guides/листы/функции
Это означает, что вы не можете вызвать cell.setValue() в контексте пользовательской функции. Это имеет смысл, если вы думаете об этом — ваша электронная таблица может содержать 1000 строк, каждая со своей собственной функцией, выполняющей несколько вызовов на сервер. В JavaScript каждый вызов функции создает свой собственный контекст выполнения, поэтому все может стать очень уродливым.
2) Для лучшей производительности используйте пакетные операции и не чередуйте действия чтения/записи. Вместо этого прочитайте все данные, необходимые для обработки в переменных, и оставьте таблицу в отдельности. После обработки ваших данных выполните одно действие записи для обновления значений в целевом диапазоне. Нет необходимости проходить ячейку по ячейке, когда вы можете получить весь диапазон, используя GAS.
Ниже приведен пример быстрого кода, который работает onOpen и onEdit. Если вам нужна большая гибкость с точки зрения запуска сценария, посмотрите на динамически созданные триггеры https://developers.google.com/apps-script/reference/script/script-app. Поскольку в ваших таблицах много строк, вы в любом случае может попасть в квоту выполнения — с помощью триггеров вы можете обойти ограничение.
Наконец, если ячейка, содержащая «—-«, является редким явлением, может быть лучше создать другую переменную массива с новыми значениями и номерами строк для обновления, чем обновление всего диапазона. Лично я думаю, что действие обновления одного диапазона все равно будет быстрее, но вы можете попробовать оба подхода и посмотреть, какой из них лучше всего работает.
function onOpen() < test(); >function onEdit() < test(); >function test() < var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheet = ss.getSheetByName(‘yourSheetName’); //range to replace values in var range = sheet.getRange(2, 4, sheet.getLastRow() — 1, 1); //range to get new values from var lookupRange = range.offset(0, -2); //2d array of values from the target range var values = range.getValues(); //2d array of values from the source range var lookupValues = lookupRange.getValues(); //looping through the values array and checking if array element meets our condition for (var i=0; i < values.length; i++) < values[i][0] = (values[i][0] == ‘——‘) ? lookupValues[i][0] : values[i][0]; >// one method call to update the range range.setValues(values); >
Anton Dementiev 12 авг.
2017, в 23:55
Поделиться
Твердый ответ. Чтобы уточнить, для перевода в контекст пользователя, я считаю: а) это предполагает, что в книге есть только один лист (в противном случае вам нужен getActiveSheet () или потенциально число, отличное от 0, в getSheets () [0], b) как указано в вашем комментарии, в примере пользователя ваш столбец 3 будет столбцом 4, и c) ваш == ‘-‘ будет == ‘——‘.
Jeremy Kahan 13 авг. 2017, в 12:12
Спасибо за исправление — я обновил свой ответ. Кроме того, я не уверен, что ОП действительно использует пользовательские функции. Из того, что он написал, видно, что он вызывает функцию непосредственно из ячейки, и в этом случае ‘input’ будет фактическим значением в ячейке, поэтому var cell = sheet.getRange (» ‘+ input +’ «‘) не будет работать. cell.setValue () всегда выдает ошибку при вызове из пользовательской функции.
Anton Dementiev 13 авг. 2017, в 12:29
Спасибо, что объяснили это по поводу ввода. Я думаю, что было бы безопаснее сказать, что когда я попробовал функцию OP как пользовательскую функцию, это было источником ошибки, которую я получил. SetValue работает в моей пользовательской функции, как только я даю разрешение. Я думаю, ты тоже это сделал. Кажется, трудно поверить, что setValues сработает, но setValue не сработает (но я могу упустить некоторые тонкости в зависимости от функции и пользовательской функции).
Jeremy Kahan 13 авг. 2017, в 12:34
Вы физически вводите функцию в ячейку электронной таблицы, например, как в формуле? Например, следующее всегда дает мне сбой function MY_FUNC (input) Когда я использую MY_FUNC в качестве пользовательской функции (в основном, формулу), набирая ее в ячейке, например this = MY_FUNC (5), я всегда получаю сообщение об ошибке, говоря, что у меня нет разрешения на выполнение setValue (). Это согласуется с документацией GAS, поэтому мне любопытно, как вы заставили setValues () работать
Anton Dementiev 13 авг. 2017, в 12:46
Нет. (Вошел на листы) Я зашел в Инструменты, Редактор сценариев и поместил туда код. Затем я сохраняю (в противном случае это kvetches «не могу найти мою функцию»). Тогда я ударил беги. В первый раз я получаю всплывающее окно «Требуется авторизация, поэтому для получения доступа к вашим данным в Google требуется разрешение». Я нажимаю «Просмотреть разрешения», авторизируюсь и нажимаю «Разрешить».
Jeremy Kahan 13 авг. 2017, в 14:00
Понимаю. Похоже, нормальный поток авторизации для всех функций. Я имел в виду пользовательские функции, которые вы определяете в своем скриптовом проекте, но на самом деле можете вызывать их непосредственно из ячейки листа. Из того, что написал ОП, я предположил, что он использовал эту технику
Anton Dementiev 13 авг. 2017, в 14:04
Показать ещё 4 комментария
Ещё вопросы
Источник: overcoder.net