谷歌应用程序幻灯片页面元素带来前似乎是随机的 修改点:修改后的脚本:参考:

问题描述

我已阅读Bring the pageElements to front or back using apps script in Google Slides 我为我的幻灯片加载了骰子图像。根据我期望的加载顺序:

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 用于搜索具有标题的页面元素。例如,当 3 指定为 showMe 时,标题为 dice 3 的页面元素被移到最前面。
  • 当存在具有相同标题的页面元素时,脚本不会运行。请注意这一点。
  • 如果您想查看其他标题,请修改obj

参考:

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...