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

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

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

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

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

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

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

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

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

слайды/выбор/выбор.gs
const selection = SlidesApp.getActivePresentation().getSelection();

Чтение текущей страницы

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

слайды/выбор/выбор.gs
const currentPage = SlidesApp.getActivePresentation().getSelection().getCurrentPage();

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

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

Чтение выборки на основе типа выборки

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

слайды/выбор/выбор.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() . Существует два типа выделения текста:

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

Изменение выбора

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

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

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

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

слайды/выбор/выбор.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() . Это также отменяет выбор всех ранее выбранных элементов страницы.

Например:

слайды/выбор/выбор.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) . Все элементы страницы должны находиться на текущей странице.

слайды/выбор/выбор.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.

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

слайды/выбор/выбор.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() . Если текст содержится в фигуре, то эта фигура также выделяется. Если текст содержится в ячейке таблицы, то выделяются как эта ячейка, так и содержащая её таблица.

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

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

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

слайды/выбор/выбор.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
//

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

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

слайды/выбор/выбор.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
//

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

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

слайды/выбор/выбор.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
//

Выбор курсора в TableCell

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

слайды/выбор/выбор.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
//

Преобразование выделения с текстовым редактированием

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

слайды/выбор/выбор.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() .

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

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

слайды/выбор/выбор.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();

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

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

слайды/выбор/выбор.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();