Возможно ли получить диапазон, окружающий определенную ячейку, аналогичную Ctrl + A в электронной таблице?Выберите смежный диапазон в скрипте приложения для таблицы
ответ
У меня есть несколько таблиц, где таблицы создаются функциями QUERY()
, поэтому границы гибкие. В прошлом я прибегал к настройке именованных диапазонов, размер которых, как я ожидаю, является самым большим, что потребует результатов QUERY, и используя эти диапазоны имен для других операций.
Больше не нужно!
Вот функцию полезности, getContiguousRange()
, которая принимает расположение клеток в A1 нотации, и возвращает Range
смежных ячеек, которые содержат его. Этот код доступен in a gist.
/**
* Return the contiguous Range that contains the given cell.
*
* @param {String} cellA1 Location of a cell, in A1 notation.
* @param {Sheet} sheet (Optional) sheet to examine. Defaults
* to "active" sheet.
*
* @return {Range} A Spreadsheet service Range object.
*/
function getContiguousRange(cellA1,sheet) {
// Check for parameters, handle defaults, throw error if required is missing
if (arguments.length < 2)
sheet = SpreadsheetApp.getActiveSheet();
if (arguments.length < 1)
throw new Error("getContiguousRange(): missing required parameter.");
// A "contiguous" range is a rectangular group of cells whose "edge" contains
// cells with information, with all "past-edge" cells empty.
// The range will be no larger than that given by "getDataRange()", so we can
// use that range to limit our edge search.
var fullRange = sheet.getDataRange();
var data = fullRange.getValues();
// The data array is 0-based, but spreadsheet rows & columns are 1-based.
// We will make logic decisions based on rows & columns, and convert to
// 0-based values to reference the data.
var topLimit = fullRange.getRowIndex(); // always 1
var leftLimit = fullRange.getColumnIndex(); // always 1
var rightLimit = fullRange.getLastColumn();
var bottomLimit = fullRange.getLastRow();
// is there data in the target cell? If no, we're done.
var contiguousRange = SpreadsheetApp.getActiveSheet().getRange(cellA1);
var cellValue = contiguousRange.getValue();
if (cellValue = "") return contiguousRange;
// Define the limits of our starting dance floor
var minRow = contiguousRange.getRow();
var maxRow = minRow;
var minCol = contiguousRange.getColumn();
var maxCol = minCol;
var chkCol, chkRow; // For checking if the edge is clear
// Now, expand our range in one direction at a time until we either reach
// the Limits, or our next expansion would have no filled cells. Repeat
// until no direction need expand.
var expanding;
do {
expanding = false;
// Move it to the left
if (minCol > leftLimit) {
chkCol = minCol - 1;
for (var row = minRow; row <= maxRow; row++) {
if (data[row-1][chkCol-1] != "") {
expanding = true;
minCol = chkCol; // expand left 1 column
break;
}
}
}
// Move it on up
if (minRow > topLimit) {
chkRow = minRow - 1;
for (var col = minCol; col <= maxCol; col++) {
if (data[chkRow-1][col-1] != "") {
expanding = true;
minRow = chkRow; // expand up 1 row
break;
}
}
}
// Move it to the right
if (maxCol < rightLimit) {
chkCol = maxCol + 1;
for (var row = minRow; row <= maxRow; row++) {
if (data[row-1][chkCol-1] != "") {
expanding = true;
maxCol = chkCol; // expand right 1 column
break;
}
}
}
// Then get on down
if (maxRow < bottomLimit) {
chkRow = maxRow + 1;
for (var col = minCol; col <= maxCol; col++) {
if (data[chkRow-1][col-1] != "") {
expanding = true;
maxRow = chkRow; // expand down 1 row
break;
}
}
}
} while (expanding); // Lather, rinse, repeat
// We've found the extent of our contiguous range - return a Range object.
return sheet.getRange(minRow, minCol, (maxRow - minRow + 1), (maxCol - minCol + 1))
}
В качестве теста рассмотрите эту таблицу. Он имеет два смежных диапазона, оба с оборванными краями.
Вот наша тестовая функция:
function testRanges() {
var range1 = getContiguousRange("C3").getA1Notation();
var range2 = getContiguousRange("B8").getA1Notation();
debugger; // Pause if running in debugger
}
И это то, что мы получаем:
Я надеюсь, что помогает!
Очень умный! Спасибо за обмен, +1. –
Я пробовал выше, что я не могу прокомментировать из-за отсутствия репутации, на листе с несколькими листами и нашел, что он работает лучше, если вы меняете строку: var contiguousRange = SpreadsheetApp.getActiveSheet() .getRange (cellA1); с var contiguousRange = sheet.getRange (cellA1);
- 1. guava смежный диапазон по правилу
- 2. Выберите диапазон строк из таблицы
- 3. CSS: Выберите первый смежный родственный
- 4. Выберите диапазон строк из таблицы PostgreSQL
- 5. Диапазон дат в выберите
- 6. Выберите диапазон строк для формулы
- 7. выберите диапазон ячеек в VBA
- 8. Выберите диапазон файлов, используя диапазон в python
- 9. Выберите диапазон букв
- 10. Выберите диапазон дат
- 11. Смежный селектор родственный, выберите `` former_element` в former_element + target_element`
- 12. Выберите контентный диапазон
- 13. Выберите диапазон в массивах, C
- 14. CSS смежный смежный разброс выпадающего меню margin
- 15. Выберите диапазон номеров?
- 16. MySQL. Выберите диапазон лет
- 17. R Выберите диапазон данных
- 18. Выберите диапазон и сортировку
- 19. Выберите диапазон «не работает»
- 20. Выберите диапазон строк в блокноте ++
- 21. выберите диапазон значений в mysql
- 22. Выберите диапазон строк в запросе
- 23. выберите динамический диапазон в vba
- 24. Выберите диапазон в contenteditable div
- 25. Определить динамический диапазон для таблицы
- 26. Выберите динамический диапазон ячеек
- 27. R: выберите диапазон столбцов в data.table
- 28. Смежный выход в CakePHP
- 29. Выберите диапазон для select2 с помощью Capybara
- 30. Выберите определенный диапазон из таблицы с использованием критериев спящего режима
Вы имеете в виду получить весь лист в диапазоне? –
@Sergeinsas Нет, это смежный регион. Возможно, в одной таблице есть два отдельных региона, я хочу выбрать один из них. –
Вы должны быть более понятны в своем вопросе. Вы говорите об именованных диапазонах? Ctrl-A в таблице, как сказал Серж, выбирает весь лист. – Srik