プレゼンテーション内のアイテムの選択

選択とは、開いているプレゼンテーション ページで現在選択されているもの(ハイライト表示されたテキストの範囲や表など)です。このガイドでは、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();

現在のページは次のいずれかのタイプになります。

現在のページでは、1 つ以上のオブジェクトを選択できます。選択の種類は 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() メソッドを使用します。テキスト選択には次の 2 種類があります。

  • 範囲の選択: 図形に「Hello」というテキストが含まれており、「He」が選択されている場合、返される範囲の startIndex は 0、endIndex は 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() メソッドを使用します。これにより、以前に選択したページ要素の選択も解除されます。

次に例を示します。

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. 2 つの図形 A と B を選択したとします。
  2. 次に、スクリプトは図形 A を削除します。
  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
//

TableCell でのカーソルの選択

次の例は、テーブル セル内のテキスト内でカーソル選択を行う方法を示しています。

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

ページ要素を選択する

次の例は、1 つのページ要素を選択してページ上の現在の選択をすべて解除する方法を示しています。

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