google 应用幻灯片 pageElements bringToFront 似乎是随机的

google app slides pageElements bringToFront seem to be random

我已阅读 为了幻灯片,我加载了骰子图像。根据我预计的加载顺序:

0 - page title
1 - dice image 1
2 - dice image 2
3 - dice image 3
4 - dice image 4
5 - dice image 5
6 - dice image 6
7 - blank shape to cover dice - could also use lose a turn text box

bringToFront 显示的元素似乎是随机的,所以我在菜单中添加了几个 checkDice 项目。

  SlidesApp.getUi()
      .createMenu( 'Ask ?')
      .addItem('Roll', 'flipDice')
      .addItem('BE1','BE1')
      .addItem('BE2','BE2')
      .addItem('BE3','BE3')
      .addItem('BE4','BE4')
      .addSeparator()
      .addSubMenu(SlidesApp.getUi().createMenu('Check Dice')
          .addItem('Check 1', 'checkDice1')
          .addItem('Check 2', 'checkDice2')
          .addItem('Check 3', 'checkDice3')
          .addItem('Check 4', 'checkDice4')
          .addItem('Check 5', 'checkDice5')
          .addItem('Check 6', 'checkDice6'))
      .addToUi(); 

这是检查骰子的代码。

function checkDice1() {
  checkDice(1);
}

function checkDice2()  {
  checkDice(2);
}

function checkDice3()  {
  checkDice(3);
}

function checkDice4()  {
  checkDice(4);
}

function checkDice5()  {
  checkDice(5);
}

function checkDice6()  {
  checkDice(6);
}

function checkDice(showMe) {  
  const diceStackId = 'gaaaa1aa1ce_0_128';
  let presentation = SlidesApp.getActivePresentation();
  let presId = presentation.getId();
  let slide = presentation.getSlideById(diceStackId);
  let pageElements = slide.getPageElements(); 
  // let selectedPageElements = slide.getPageElementRange().getPageElements();
  
  console.log('numberof elements: ' , pageElements.length );  // numberof elements:  8
    /*  0 = title 
        1 = dice 1
        2 = dice 2
        3 = dice 3
        4 = dice 4
        5 = dice 5
        6 = dice 6
        7 = white to cover dice - could be lose turn 
    */
  // do this once
  switch (showMe)  {
    case 1 :
      console.log('Rolled 1 pageElements[1].getTitle = ',pageElements[1].getTitle() )
      pageElements[1].setTitle('Rolled-1')
      SlidesApp.getUi().alert('Show me dice number: ' + showMe + ' set title Rolled-1 ');   
      break;
    case 2  :
      console.log('Rolled 2 pageElements[2].getTitle = ',pageElements[2].getTitle() )
      pageElements[2].setTitle('Rolled-2')
      SlidesApp.getUi().alert('Show me dice number: ' + showMe + ' set title Rolled-2 ');   
      break;
    case 3  :
      console.log('Rolled 3 pageElements[3].getTitle = ',pageElements[3].getTitle() )
      pageElements[3].setTitle('Rolled-3')
      SlidesApp.getUi().alert('Show me dice number: ' + showMe + ' set title Rolled-3 ');  
      break;
    case 4  :
      console.log('Rolled 4 pageElements[4].getTitle = ',pageElements[4].getTitle() )
      pageElements[4].setTitle('Rolled-4')
      SlidesApp.getUi().alert('Show me dice number: ' + showMe + ' set title Rolled-4 ');  
      break;
    case 5  :
      console.log('Rolled 5 pageElements[5].getTitle = ',pageElements[5].getTitle() )
      pageElements[5].setTitle('Rolled-5')
      SlidesApp.getUi().alert('Show me dice number: ' + showMe + ' set title Rolled-5 ');  
      break;
    case 6  :
      console.log('Rolled 6 pageElements[6].getTitle = ',pageElements[6].getTitle() )
      pageElements[6].setTitle('Rolled-6')
      SlidesApp.getUi().alert('Show me dice number: ' + showMe + ' set title Rolled-6 ');  
      break;
  }
  SlidesApp.getUi().alert('Show me dice number: ' + showMe + ' element title: ' + pageElements[showMe].getTitle() );   
  pageElements[showMe].bringToFront();
}

警报完全符合我的预期,但显示的骰子图像似乎是随机的。它改变!如果我 运行 一遍又一遍地检查任何数字,我会得到不同的图像!我误解了 pageElements[showMe] 吗?我怎样才能得到想要的图像?


function onOpen() {
  console.log('In onOpen' );
  PropertiesService.getScriptProperties().setProperty(
    'sheetId', '1fmZCittj4ksstmhh8_t0O0csj8IDdwi9ohDDL5ZE7VA');
  const diceObj = {
    "1": "dice1", 
    "2": "dice2", 
    "3": "dice3", 
    "4": "dice4", 
    "5": "dice5", 
    "6": "dice6"
    };  
  PropertiesService.getScriptProperties().setProperty(
    'idDice', diceObj);

等然后在 checkDice 函数中:

function checkDice(showMe) {  
  const diceStackId = 'gaaafaff9f1_0_0';
  const idDice = PropertiesService.getScriptProperties().getProperty('idDice'); 
  let presentation = SlidesApp.getActivePresentation();
  let presId = presentation.getId();
  let slide = presentation.getSlideById(diceStackId);
  let pageElements = slide.getPageElements(); 
  SlidesApp.getUi().alert('Show me dice number: ' + showMe + ' element title: ' + pageElements[showMe].getTitle() );   
//  When a page element is moved to the front, the indexes are changed!
//  pageElements[showMe].bringToFront();
  const pageElement = pageElements.filter(e => e.getTitle() == idDice[showMe]);
  if (pageElement.length == 1) {
    pageElement[0].bringToFront();
  }
}

骰子在 console.log 中被识别但图像的顺序没有改变???

我相信你的目标如下。

  • 您想通过给定 showMe 的值将页面元素移动到页面的前面。 showMe 是从 1 到 6。
    • 比如3给定为showMe,你想把标题为dice 3的页面元素移到页面前面

修改点:

  • 在您的脚本中,showMe 用于 pageElements 的索引。在这种情况下,当页面元素移到前面时,索引会发生变化。我认为这可能是您遇到问题的原因。
  • 从您脚本的注释来看,页面元素的标题似乎已经给出了 1 = dice 1,2 = dice 2,3 = dice 3,,,。我认为这可能会用于实现您的目标。

当以上几点反映到你的脚本中,就会变成下面这样。

修改后的脚本:

本次修改,修改了checkDice()

function checkDice(showMe) {
  const diceStackId = 'gaaaa1aa1ce_0_128';
  let presentation = SlidesApp.getActivePresentation();
  let slide = presentation.getSlideById(diceStackId);
  let pageElements = slide.getPageElements();

  // I modified below script.
  const obj = {"1": "dice 1", "2": "dice 2", "3": "dice 3", "4": "dice 4", "5": "dice 5", "6": "dice 6"};
  const pageElement = pageElements.filter(e => e.getTitle() == obj[showMe]);
  if (pageElement.length == 1) {
    pageElement[0].bringToFront();
  }
}
  • 在此修改后的脚本中,obj用于搜索带有标题的页面元素。例如,当 3showMe 时,标题为 dice 3 的页面元素被移到前面。
  • 当存在同名页面元素时,脚本不运行。请注意这一点。
  • 如果要查看其他标题,请修改obj

参考文献: