Выберите элементы в презентации

Выделение — это содержимое, находящееся в фокусе на открытой странице презентации, например, выделенный фрагмент текста или таблица. В этом руководстве описано, как получить и установить выделение в активной презентации с помощью Apps Script.

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

Выделенный фрагмент представляет собой снимок того, каким он был на момент запуска скрипта. Если пользователь щелкнет мышью, и выделение изменится во время выполнения скрипта, эти изменения не будут отражены.

Выбор и тип выбора

Считывайте выделенный фрагмент текста с помощью класса Selection . Этот класс содержит различные методы для получения выделенных объектов в зависимости от типа выделенного объекта (объектов).

Перечисление SelectionType представляет конкретный тип выбранных объектов. Например, если пользователь выделил текст в фигуре, тип выделения будет TEXT . В этом случае вы можете получить выделенный диапазон текста, используя метод selection.getTextRange() .

Вы также можете получить объект, содержащий выделение. Например, вы можете получить фигуру, содержащую выделенный текст, используя selection.getPageElementRange().getPageElements()[0] . Аналогично, страница, содержащая окружающую фигуру, является текущей активной страницей; чтобы получить эту страницу, используйте selection.getCurrentPage() .

Чтение отрывка

Для чтения выделенного фрагмента используйте метод Presentation.getSelection() , как показано в следующем примере:

slides/selection/selection.gs
const selection = SlidesApp.getActivePresentation().getSelection();

Прочитайте текущую страницу

Чтобы получить текущую страницу , которую просматривает пользователь, используйте методы getSelection() и getCurrentPage() следующим образом:

slides/selection/selection.gs
const currentPage = SlidesApp.getActivePresentation()
  .getSelection()
  .getCurrentPage();

Обратите внимание, что текущая страница может быть любого из следующих типов:

На текущей странице может быть выбран один или несколько объектов, а параметр SelectionType определяет тип выделения.

Прочитайте выбранный фрагмент текста в зависимости от типа выделения.

В следующем примере показано, как можно использовать тип выделения для чтения текущего выделения соответствующим образом.

slides/selection/selection.gs
const selection = SlidesApp.getActivePresentation().getSelection();
const selectionType = selection.getSelectionType();
let currentPage;
switch (selectionType) {
  case SlidesApp.SelectionType.NONE:
    console.log("Nothing selected");
    break;
  case SlidesApp.SelectionType.CURRENT_PAGE:
    currentPage = selection.getCurrentPage();
    console.log(`Selection is a page with ID: ${currentPage.getObjectId()}`);
    break;
  case SlidesApp.SelectionType.PAGE_ELEMENT: {
    const pageElements = selection.getPageElementRange().getPageElements();
    console.log(`There are ${pageElements.length} page elements selected.`);
    break;
  }
  case SlidesApp.SelectionType.TEXT: {
    const tableCellRange = selection.getTableCellRange();
    if (tableCellRange !== null) {
      const tableCell = tableCellRange.getTableCells()[0];
      console.log(
        `Selected text is in a table at row ${tableCell.getRowIndex()}, column ${tableCell.getColumnIndex()}`,
      );
    }
    const textRange = selection.getTextRange();
    if (textRange.getStartIndex() === textRange.getEndIndex()) {
      console.log(`Text cursor position: ${textRange.getStartIndex()}`);
    } else {
      console.log(
        `Selection is a text range from: ${textRange.getStartIndex()} to: ${textRange.getEndIndex()} is selected`,
      );
    }
    break;
  }
  case SlidesApp.SelectionType.TABLE_CELL: {
    const tableCells = selection.getTableCellRange().getTableCells();
    const table = tableCells[0].getParentTable();
    console.log(`There are ${tableCells.length} table cells selected.`);
    break;
  }
  case SlidesApp.SelectionType.PAGE: {
    const pages = selection.getPageRange().getPages();
    console.log(`There are ${pages.length} pages selected.`);
    break;
  }
  default:
    break;
}

Прочитайте фрагменты текста.

Считывайте выделенный текст с помощью метода Selection.getTextRange() . Существует два типа выделения текста:

  • Выбор диапазона : Если фигура содержит текст "Hello", и выбран текст "He", возвращаемый диапазон будет иметь начальный индекс = 0 и конечный индекс = 2.
  • Выбор курсора : Если фигура содержит текст "Hello", и курсор находится после "H" ("H|ello"), возвращается пустой диапазон с startIndex=1 и endIndex=1.

Изменение выделения

Скрипт может изменять выбор пользователя. Любые изменения выбора, внесенные скриптом в представление, отражаются в последующих операциях выбора на протяжении всего выполнения скрипта.

Изменения в выделении отображаются в браузере пользователя только после завершения выполнения скрипта или при вызове Presentation.saveAndClose() .

Выбор текущей страницы

В активной презентации можно выбрать страницу в качестве текущей, вызвав метод ` selectAsCurrentPage()` . Этот метод удаляет все предыдущие элементы страницы, выделенные страницы или текст. Таким образом, использование этого метода на текущей странице позволяет отменить выделение любых текущих элементов на странице. Например:

slides/selection/selection.gs
// Select the first slide as the current page selection and remove any previous selection.
const selection = SlidesApp.getActivePresentation().getSelection();
const slide = SlidesApp.getActivePresentation().getSlides()[0];
slide.selectAsCurrentPage();
// State of selection
//
// selection.getSelectionType() = SlidesApp.SelectionType.CURRENT_PAGE
// selection.getCurrentPage() = slide
//

Выберите элемент страницы

Для выбора элемента страницы используйте метод PageElement.select() . При этом также отменяется выбор всех ранее выбранных элементов страницы.

Методы select() и select(true) эквивалентны.

Например:

slides/selection/selection.gs
const slide = SlidesApp.getActivePresentation().getSlides()[0];
const pageElement = slide.getPageElements()[0];
// Only select this page element and remove any previous selection.
pageElement.select();
// State of selection
//
// selection.getSelectionType() = SlidesApp.SelectionType.PAGE_ELEMENT
// selection.getCurrentPage() = slide
// selection.getPageElementRange().getPageElements()[0] = pageElement
//

Выберите несколько элементов страницы

Для добавления дополнительных элементов страницы к выделенной области используйте метод PageElement.select(false) . Все элементы страницы должны находиться на текущей странице.

slides/selection/selection.gs
const slide = SlidesApp.getActivePresentation().getSlides()[0];
// First select the slide page, as the current page selection.
slide.selectAsCurrentPage();
// Then select all the page elements in the selected slide page.
const pageElements = slide.getPageElements();
for (let i = 0; i < pageElements.length; i++) {
  pageElements[i].select(false);
}
// State of selection
//
// selection.getSelectionType() = SlidesApp.SelectionType.PAGE_ELEMENT
// selection.getCurrentPage() = slide
// selection.getPageElementRange().getPageElements() = pageElements
//

Преобразовать выделенный фрагмент

Изменения, вносимые вашим скриптом, могут трансформировать текущее выделение, так что в результате редактирования изменится и то, что выделено. Например:

  1. Предположим, вы выбрали две фигуры: A и B.
  2. Далее ваш скрипт удаляет фигуру А.
  3. В результате выделение преобразуется относительно редактирования таким образом, что выделяется только фигура B.

В следующем примере показано, как можно изменить выделенную область, манипулируя выбранными элементами страницы.

slides/selection/selection.gs
const slide = SlidesApp.getActivePresentation().getSlides()[0];
const shape1 = slide.getPageElements()[0].asShape();
const shape2 = slide.getPageElements()[1].asShape();
// Select both the shapes.
shape1.select();
shape2.select(false);
// State of selection
//
// selection.getSelectionType() = SlidesApp.SelectionType.PAGE_ELEMENT
// selection.getCurrentPage() = slide
// selection.getPageElementRange().getPageElements() = [shape1, shape2]
//
// Remove one shape.
shape2.remove();
// State of selection
//
// selection.getSelectionType() = SlidesApp.SelectionType.PAGE_ELEMENT
// selection.getCurrentPage() = slide
// selection.getPageElementRange().getPageElements() = [shape1]
//

Выделите текст

Текст, содержащийся в фигуре или ячейке таблицы, можно выделить с помощью метода TextRange.select() . Если текст находится в фигуре, то выделяется и эта фигура. Если текст находится в ячейке таблицы, то выделяются как эта ячейка таблицы, так и окружающая её таблица.

Это также устанавливает родительскую страницу в качестве текущей страницы.

Выбор диапазона в форме

В следующем примере показано, как выделить диапазон текста, содержащегося в фигуре.

slides/selection/selection.gs
const slide = SlidesApp.getActivePresentation().getSlides()[0];
const shape = slide.getPageElements()[0].asShape();
shape.getText().setText("Hello");
// Range selection: Select the text range 'He'.
shape.getText().getRange(0, 2).select();
// State of selection
//
// selection.getSelectionType() = SlidesApp.SelectionType.TEXT
// selection.getCurrentPage() = slide
// selection.getPageElementRange().getPageElements()[0] = shape
// selection.getTextRange().getStartIndex() = 0
// selection.getTextRange().getEndIndex() = 2
//

Выбор курсора в фигуре

В следующем примере показано, как выделить текст внутри фигуры с помощью курсора.

slides/selection/selection.gs
const slide = SlidesApp.getActivePresentation().getSlides()[0];
const shape = slide.getPageElements()[0].asShape();
shape.getText().setText("Hello");
// Cursor selection: Place the cursor after 'H' like 'H|ello'.
shape.getText().getRange(1, 1).select();
// State of selection
//
// selection.getSelectionType() = SlidesApp.SelectionType.TEXT
// selection.getCurrentPage() = slide
// selection.getPageElementRange().getPageElements()[0] = shape
// selection.getTextRange().getStartIndex() = 1
// selection.getTextRange().getEndIndex() = 1
//

Выбор диапазона значений в ячейке таблицы

В следующем примере показано, как выделить диапазон текста в ячейке таблицы.

slides/selection/selection.gs
const slide = SlidesApp.getActivePresentation().getSlides()[0];
const table = slide.getPageElements()[0].asTable();
const tableCell = table.getCell(0, 1);
tableCell.getText().setText("Hello");
// Range selection: Select the text range 'He'.
tableCell.getText().getRange(0, 2).select();
// State of selection
//
// selection.getSelectionType() = SlidesApp.SelectionType.TEXT
// selection.getCurrentPage() = slide
// selection.getPageElementRange().getPageElements()[0] = table
// selection.getTableCellRange().getTableCells()[0] = tableCell
// selection.getTextRange().getStartIndex() = 0
// selection.getTextRange().getEndIndex() = 2
//

Выбор курсора в ячейке таблицы

В следующем примере показано, как выделить текст внутри ячейки таблицы с помощью курсора.

slides/selection/selection.gs
const slide = SlidesApp.getActivePresentation().getSlides()[0];
const table = slide.getPageElements()[0].asTable();
const tableCell = table.getCell(0, 1);
tableCell.getText().setText("Hello");
// Cursor selection: Place the cursor after 'H' like 'H|ello'.
tableCell.getText().getRange(1, 1).select();
// State of selection
//
// selection.getSelectionType() = SlidesApp.SelectionType.TEXT
// selection.getCurrentPage() = slide
// selection.getPageElementRange().getPageElements()[0] = table
// selection.getTableCellRange().getTableCells()[0] = tableCell
// selection.getTextRange().getStartIndex() = 1
// selection.getTextRange().getEndIndex() = 1
//

Преобразование выделенного фрагмента текста с помощью редактирования текста.

В следующем примере показано, как можно изменить выделенный фрагмент, отредактировав его.

slides/selection/selection.gs
const slide = SlidesApp.getActivePresentation().getSlides()[0];
const shape = slide.getPageElements()[0].asShape();
const textRange = shape.getText();
textRange.setText("World");
// Select all the text 'World'.
textRange.select();
// State of selection
//
// selection.getSelectionType() = SlidesApp.SelectionType.TEXT
// selection.getCurrentPage() = slide
// selection.getPageElementRange().getPageElements()[0] = shape
// selection.getTextRange().getStartIndex() = 0
// selection.getTextRange().getEndIndex() = 6
//
// Add some text to the shape, and the selection will be transformed.
textRange.insertText(0, "Hello ");

// State of selection
//
// selection.getSelectionType() = SlidesApp.SelectionType.TEXT
// selection.getCurrentPage() = slide
// selection.getPageElementRange().getPageElements()[0] = shape
// selection.getTextRange().getStartIndex() = 0
// selection.getTextRange().getEndIndex() = 12
//

Снять выделение

Явных методов для отмены выделения текста или элементов страницы не существует. Однако этого можно добиться с помощью методов Page.selectAsCurrentPage() или pageElement.select() .

Выберите текущую страницу

В следующем примере показано, как отменить выделение любых текущих элементов на странице, установив эту страницу в качестве текущей.

slides/selection/selection.gs
// Unselect one or more page elements already selected.
//
// In case one or more page elements in the first slide are selected, setting the
// same (or any other) slide page as the current page would do the unselect.
//
const slide = SlidesApp.getActivePresentation().getSlides()[0];
slide.selectAsCurrentPage();

Выберите элемент страницы

В следующем примере показано, как отменить выделение элементов на странице, выбрав один элемент страницы и удалив таким образом все остальные элементы из выделения.

slides/selection/selection.gs
// Unselect one or more page elements already selected.
//
// In case one or more page elements in the first slide are selected,
// selecting any pageElement in the first slide (or any other pageElement) would
// do the unselect and select that pageElement.
//
const slide = SlidesApp.getActivePresentation().getSlides()[0];
slide.getPageElements()[0].select();