问题描述
我已阅读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
。