我有一个数组,我正在尝试使用其中的信息来创建Google幻灯片演示文稿。我想要一些帮助,如果可能的话,还要指出一些我可以阅读的材料,以便更好地理解这些问题的可能解决方案。
数组如下:
var myArray = [[Project1,Status1,Info1],[Project2,Status2,Info2],...,[ProjectN,StatusN,InfoN]]
数组中的每个元素都引用一个不同的项目并包含:
所有这些都是字符串。数组中的元素数量可能会有所不同,但它们将始终遵循此结构。
在演示文稿中,我在主布局中创建了一个名为“NEW LAYOUT”的新布局。该布局有4组,每组有3个占位符。每组占位符应该填充不同项目的信息,这意味着一组占位符将填充myArray[i][1]
,myArray[i][2]
和myArray[i][3]
。
到目前为止,我的代码如下:
function CreatingSlides() {
var displayName = "NEW LAYOUT"; // Name of the layout that I created
var presentationId = SlidesApp.openById(PageId).getId(); //It is an existing presentation, so I just get its ID
var layouts = Slides.Presentations.get(presentationId).layouts;
var layout = {};
//The following is the array of elements. In this example,
//I only used 4 projects, but it may vary and may not be
//a multiple of 4.
var myArray = [["Project1","Status1","Info1"],["Project2","Status2","Info2"],["Project3","Status3","Info3"],["Project4","Status4","Info4"]];
//This loop searches for the layout that I created
for (i in layouts) {
layout[layouts[i].layoutProperties.displayName] = layouts[i].objectId;
}
//In the slide created, this loop will fill the information in it using the myArray
for (i in myArray) {
var resource = {"requests": [{"createSlide": {"slideLayoutReference": {"layoutId": layout[displayName]},
"placeholderIdMappings": [{"layoutPlaceholder": {"type": "SUBTITLE","index": 0},"objectId":myArray[i][1],},],
"placeholderIdMappings": [{"layoutPlaceholder": {"type": "BODY","index": 0},"objectId":myArray[i][2],},],
"placeholderIdMappings": [{"layoutPlaceholder": {"type": "BODY","index": 1},"objectId":myArray[i][3],},],
"placeholderIdMappings": [{"layoutPlaceholder": {"type": "SUBTITLE","index": 1},"objectId":myArray[i+1][1],},],
"placeholderIdMappings": [{"layoutPlaceholder": {"type": "BODY","index": 2},"objectId":myArray[i+1][2],},],
"placeholderIdMappings": [{"layoutPlaceholder": {"type": "BODY","index": 3},"objectId":myArray[i+1][3],},],
"placeholderIdMappings": [{"layoutPlaceholder": {"type": "SUBTITLE","index": 2},"objectId":myArray[i+2][1],},],
"placeholderIdMappings": [{"layoutPlaceholder": {"type": "BODY","index": 4},"objectId":myArray[i+2][2],},],
"placeholderIdMappings": [{"layoutPlaceholder": {"type": "BODY","index": 5},"objectId":myArray[i+2][3],},],
"placeholderIdMappings": [{"layoutPlaceholder": {"type": "SUBTITLE","index": 3},"objectId":myArray[i+3][1],},],
"placeholderIdMappings": [{"layoutPlaceholder": {"type": "BODY","index": 6},"objectId":myArray[i+3][2],},],
"placeholderIdMappings": [{"layoutPlaceholder": {"type": "BODY","index": 7},"objectId":myArray[i+3][3],},],
}
},
{"insertText": {"objectId": myArray[i][1],"text": myArray[i][1],},
"insertText": {"objectId": myArray[i][2],"text": myArray[i][2],},
"insertText": {"objectId": myArray[i][3],"text": myArray[i][3],},
"insertText": {"objectId": myArray[i+1][1],"text": myArray[i+1][1],},
"insertText": {"objectId": myArray[i+1][2],"text": myArray[i+1][2],},
"insertText": {"objectId": myArray[i+1][3],"text": myArray[i+1][3],},
"insertText": {"objectId": myArray[i+2][1],"text": myArray[i+2][1],},
"insertText": {"objectId": myArray[i+2][2],"text": myArray[i+2][2],},
"insertText": {"objectId": myArray[i+2][3],"text": myArray[i+2][3],},
"insertText": {"objectId": myArray[i+3][1],"text": myArray[i+3][1],},
"insertText": {"objectId": myArray[i+3][2],"text": myArray[i+3][2],},
"insertText": {"objectId": myArray[i+3][3],"text": myArray[i+3][3],}},
]};
Slides.Presentations.batchUpdate(resource, presentationId);
}
}
问题1:当数组中的元素数量可能有所不同时,如何执行此操作?
在这段代码中,我在myArray中只使用了4个元素,因此创建的幻灯片中的所有占位符都将被填充。但是,如果元素的数量大于4,我怎么能告诉它创建一个新的幻灯片。此外,元素的数量可能不是4的倍数(可能是5,可能是60,可能是是72 ...)。
问题2:我不知道如何在请求中正确使用objectIds
我从我在Google Apps脚本参考中看到的另一个代码中获得了这部分内容。在其中,我理解,在请求中,如果首先为objectId设置名称,然后使用该名称在该占位符中写入内容。但是,这会产生一些问题:objectId有时不接受我试图给它的名称,或者objectId说它不能使用我建议的名称,因为它应该是唯一的。有更好的方法吗?
问题3:是否可以不必编写12行来填充占位符?
我认为这只会发生,因为我不知道如何正确使用objectIds(问题2)。因此,我必须单独命名幻灯片中的每个objectId。我相信有一些方法可以使用循环来做到这一点,但到目前为止我还没有找到解决方案或理解它。
答案 0 :(得分:1)
首先建议:您使用Advanced Google Service for Slides和内置Slides service (SlidesApp)的混合。如果你只使用SlidesApp会更简单,因为它应该做你需要的,你不必担心让objectIds正确。
回答你的问题:
这里的问题是你的布局中只有12个占位符。试图填写超过这些数量的人不会起作用,因为你将要用尽占位符来填补。您在这里的选择是:不要使用占位符,而是创建和定位文本框,或以不同方式呈现您的数据。例如,每个项目使用1张幻灯片,其中包含3个占位符,一个用于项目名称,状态和信息。
我建议您手动创建一个示例幻灯片,以设计您希望最终幻灯片的外观,并向后工作以编写代码以生成它。通常在像{{project_1}}: {{status_1}}
这样的可变字符串的幻灯片上执行ReplaceAllText会很有效。
您正在尝试为占位符提供对象ID,然后使用InsertText设置内容。我认为您的问题是placeholderIdMappings不正确,您需要一个映射对象列表,而不是多次指定placeholderIdMappings键(请参阅此sample)。
{
"createSlide": {
"objectId": pageId,
"slideLayoutReference": {
"layoutId": "layoutId"
},
"placeholderIdMappings": [
{
"layoutPlaceholder": {
"type": "SUBTITLE",
"index": 0
},
"objectId": "project1Id",
},
{
"layoutPlaceholder": {
"type": "BODY",
"index": 0
},
"objectId": "project1Id",
},
],
}
}
我认为这主要是由于您构建项目数据的方式,幻灯片的布局以及placeholderIdMappings问题。修复这些应该使这更容易处理。
处理SlidesApp(使用Slide#getPlaceholder)
也应该更容易