Seleccionar elementos dentro de una presentación

La selección es lo que está seleccionado en un momento determinado en una página de presentación abierta, como un intervalo de texto destacado o una tabla. En esta guía, se explica cómo obtener y establecer la selección en una presentación activa mediante Apps Script.

La selección es una instantánea de lo que era cuando comenzó la secuencia de comandos. Si el usuario hace clic y la selección cambia mientras se ejecuta la secuencia de comandos, esos cambios no se reflejarán.

Selecciones y tipo de selección

Puedes leer la selección con la clase Selection. Tiene varios métodos para obtener los objetos seleccionados según el tipo de objetos seleccionados.

La enumeración SelectionType representa el tipo específico de objetos seleccionados. Por ejemplo, si el usuario seleccionó texto en una forma, el tipo de selección será TEXTO. En este caso, puedes recuperar el rango de texto seleccionado con el método selection.getTextRange().

También puedes recuperar el objeto que contiene la selección. Si sigues con el ejemplo anterior, puedes recuperar la forma que contiene el texto seleccionado mediante selection.getPageElementRange().getPageElements()[0]. De manera similar, la página que contiene la forma adjunta es la página activa actual. Para recuperar esa página, usa selection.getCurrentPage().

Cómo leer la selección

Para leer la selección, usa el método Presentation.getSelection() como se muestra en el siguiente ejemplo:

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

Cómo leer la página actual

Para recuperar la Page actual que está viendo el usuario, usa los métodos getSelection() y getCurrentPage() de la siguiente manera:

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

Ten en cuenta que la página actual puede ser de alguno de los siguientes tipos:

La página actual puede tener uno o más objetos seleccionados, y SelectionType determina el tipo de selección.

Cómo leer la selección según el tipo de selección

En el siguiente ejemplo, se muestra cómo puedes usar el tipo de selección para leer la selección actual de una manera adecuada.

diapositivas/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;
}

Cómo leer selecciones de texto

Puedes leer la selección de texto con el método Selection.getTextRange(). Hay dos tipos de selección de texto:

  • Selección de rango: Si una forma contiene el texto "Hello" y está seleccionado "He", el rango que se muestra tiene startIndex=0 y endIndex=2.
  • Selección del cursor: Si una forma contiene el texto "Hola" y el cursor está después de "H" ("H|ello"), el rango que se muestra estará vacío con startIndex=1 y endIndex=1.

Cómo modificar la selección

La secuencia de comandos puede modificar la selección del usuario. Cualquier cambio de selección que la secuencia de comandos realice a la presentación se reflejará en operaciones de selección posteriores mientras dure la ejecución de la secuencia de comandos.

Los cambios de selección se reflejan en el navegador del usuario solo después de que se completa la ejecución de la secuencia de comandos o cuando se llama a Presentation.saveAndClose().

Selecciona la página actual

Para seleccionar una página en la presentación activa como la página actual, llama al método selectAsCurrentPage(). Este método quita cualquier elemento de la página, página o selección de texto anterior. Por lo tanto, usar este método en la página actual te permite anular la selección de cualquier selección actual en la página. Por ejemplo:

diapositivas/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
//

Cómo seleccionar un elemento de página

Para seleccionar un elemento de página en una página, usa el método PageElement.select(). Con esta acción, también se anula la selección de los elementos de página seleccionados anteriormente.

Por ejemplo:

diapositivas/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
//

Seleccionar varios elementos de página

Para agregar elementos de página adicionales a la selección, usa el método PageElement.select(false). Todos los elementos de la página deben estar en la página actual.

diapositivas/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
//

Cómo transformar la selección

Las ediciones que realiza la secuencia de comandos pueden transformar la selección actual, de modo que lo que se selecciona cambie como resultado de la edición. Por ejemplo:

  1. Supongamos que tienes dos formas A y B seleccionadas.
  2. Luego, tu guion quita la forma A.
  3. Como resultado, la selección se transforma en función de la edición, de modo que solo se seleccione la forma B.

En el siguiente ejemplo, se muestra cómo se puede transformar la selección mediante la manipulación de los elementos de página seleccionados.

diapositivas/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]
//

Cómo seleccionar texto

El texto contenido en una forma o en una celda de una tabla se puede seleccionar con el método TextRange.select(). Si el texto está contenido en una forma, también se seleccionará esa forma. Si el texto está contenido en una celda de tabla, se seleccionarán esa celda y la tabla que la contiene.

Esto también definirá la página principal como la página actual.

Selección de rango en una forma

En el siguiente ejemplo, se muestra cómo seleccionar un rango dentro del texto contenido en una forma.

diapositivas/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
//

Selección del cursor en una forma

En el siguiente ejemplo, se muestra cómo realizar una selección del cursor dentro del texto contenido en una forma.

diapositivas/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
//

Selección de rango en una celda de la tabla

En el siguiente ejemplo, se muestra cómo realizar una selección de rango dentro del texto contenido en una celda de la tabla.

diapositivas/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
//

Selección del cursor en TableCell

En el siguiente ejemplo, se muestra cómo realizar una selección de cursor dentro del texto contenido en una celda de una tabla.

diapositivas/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
//

Transformación de la selección con ediciones textuales

En el siguiente ejemplo, se muestra cómo se puede transformar la selección si editas el texto seleccionado.

diapositivas/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
//

Anulando la selección

No hay métodos explícitos para anular la selección de elementos de página o texto. Sin embargo, este resultado se puede lograr usando los métodos Page.selectAsCurrentPage() o pageElement.select().

Seleccionar una página actual

En el siguiente ejemplo, se muestra cómo anular la selección de cualquier selección actual en una página mediante la configuración de esa página como la actual.

diapositivas/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();

Selecciona un elemento de la página

En el siguiente ejemplo, se muestra cómo anular la selección de cualquier selección actual en una página mediante la selección de un elemento de la página y, de esta manera, quitar todos los demás elementos de la selección.

diapositivas/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();