请再看一遍:Google 高级幻灯片 API 在现有 table 中插入文本
Please Look Again: Google Advanced Slides API insert text in existing table
问题:如何将文本插入 Google 幻灯片中现有 table 的单元格中?
我有一个现有的演示文稿,其中包含一个模型 table,其中包含所需的所有尺寸和颜色。它不包含任何文本。这是我 运行 尝试填充 table.
的代码
let templatePres = SlidesApp.openById(templatePresId);
let slidesArr = templatePres.getSlides();
let templateSlideId = slidesArr[0].getObjectId();
let tblArr = slidesArr[0].getTables();
let theTblId = tblArr[0].getObjectId(); // table page element
let requests =[]
,numRows = 8, numCols = 8
,r, c, nextReq, nextVal
,theTableCellObj ,theTableRowObj ,theTableObj ,thePageElement
for ( c = 0 ; c < numCols ; c++ ) {
for ( r = 0 ; r < numRows ; r++ ) {
theTableCellObj =
{
"location": {
"rowIndex": r
,"columnIndex": c
},
"text": { nextVal }
};
theTableRowObj =
{
"tableCells": [ theTableCellObj ]
}
theTableObj =
{
"rows": numRows,
"columns": numCols,
"tableRows": [ theTableRowObj ]
}
thePageElement =
{
"objectId": theTblId,
"table": theTableObj
};
nextVal = inArr[r][c].toString();
console.log('r: ', r, ' c: ', c, ' val: ', nextVal );
nextReq =
{
"objectId": templateSlideId,
"pageType": 'SLIDE',
"pageElements": [thePageElement]
}
requests.push(nextReq);
console.log(JSON.stringify(nextReq) );
}
}
batchUpdate 中每个请求的错误如下所示:
GoogleJsonResponseException: API call to slides.presentations.batchUpdate failed with error: Invalid JSON payload received. Unknown name "pageElements" at 'requests[0]': Cannot find field.
Invalid JSON payload received. Unknown name "pageType" at 'requests[0]': Cannot find field.
Invalid JSON payload received. Unknown name "objectId" at 'requests[0]': Cannot find field.
Invalid JSON payload received. Unknown name "pageElements" at 'requests[1]': Cannot find field.
Invalid JSON payload received. Unknown name "pageType" at 'requests[1]': Cannot find field.
...
这是console.log显示的典型请求:
{
"objectId": "SLIDES_API142383606_0"
, "pageType": "SLIDE"
, "pageElements":
[
{
"objectId": "SLIDES_API142383606_1"
, "table":
{
"rows": 8
, "columns": 8
, "tableRows": [
{
"tableCells": [
{
"location": { "rowIndex": 3, "columnIndex": 2 }
,"text": { "nextVal": "silf" }
}
]
}
]
}
}
]
}
我使用了文档,但我觉得很难。任何帮助表示赞赏。
我添加了一些日志来证明获取ids不是问题。
try {
templatePres = SlidesApp.openById(templatePresId);
} catch ( err) {
ui.alert('You do not have a presentation. Ending.');
return;
}
try {
slidesArr = templatePres.getSlides();
} catch ( err) {
ui.alert('Could not get slides from presentation. Ending.');
return;
}
let templateSlideId = slidesArr[0].getObjectId();
console.log('templateSlideId: ', templateSlideId );
try {
tblArr = slidesArr[0].getTables();
} catch ( err) {
ui.alert('Could not get slides from presentation. Ending.');
return;
}
let theTblId = tblArr[0].getObjectId(); // table page element
console.log('ttheTblId: ', theTblId );
这是日志显示:
templateSlideId: SLIDES_API1369298387_0
ttheTblId: SLIDES_API1369298387_1 // typo did not affect result
除非你很好奇,否则不要费心看下面的愚蠢想法
下面之前的尝试没有成功,因为我找不到输入幻灯片 ID 的方法。
第一步:我在现有的演示文稿中复制一份,这样我就可以在不弄乱原件的情况下添加文本。
// https://www.debugcn.com/en/article/18027667.html
let slide0 = templatePres.getSlideById(templateSlideId)
// templatePres.insertSlide(insertionIndex, slide)
templatePres.insertSlide(0, slide0);
这张临时幻灯片将填充文本,以 png 格式下载并作为背景插入到最终演示文稿中。
第二步:在临时幻灯片上填充文本w/o批量更新:
for ( let r = 0 ; r < 9 ; r++ ) {
for ( let c = 0 ; c < 9 ; r++ ) {
theTbl.getCell(r, c). ??? there are no sets or inserts
}
}
以上内容将不起作用,因为没有文本集或插入。
第二步:使用批量更新填充临时幻灯片上的文本:
构建批处理更新请求:
for ( let c = 0 ; c < 8 ; c++ ) {
for ( let r = 0 ; r < 8 ; r++ ) {
requests.push(
{"insertText":
{"objectId": theTblId
,"cellLocation": {
"rowIndex": r
,"columnIndex": c
}
,"text": inArr[r][c].toString()
// ,"text": inArr[r][c]
}
}
);
}
}
if (requests.length > 0) {
response = Slides.Presentations.batchUpdate(
{ 'requests': requests }, templatePresId );
}
它收到错误:GoogleJsonResponseException:API 调用 slides.presentations.batchUpdate 失败,出现错误:请求无效 [0].insertText:对象(SLIDES_API1834905201_1) 找不到。
SLIDES_API1834905201_1 是模型 table 的现有幻灯片的 ID。上面的请求包含了presentation id和page element/table id但是没有地方输入slide id???
我尝试将这些请求中的每一个分别添加到 insertText 请求之前的请求数组中,作为识别幻灯片的一种方式,但显然我不理解文档中的语法。列出了错误。
测试 1 错误:'requests[0]' 处的未知名称“页面”:找不到字段。
requests.push(
{'Page': {
"objectId": templateSlideId,
"pageType": 'SLIDE'
}}
);
测试 2:错误:未知名称“pageType”位于 'requests[0]':找不到字段。
收到无效的 JSON 负载。 'requests[0]' 处的未知名称“objectId”:找不到字段。
requests.push(
{
"objectId": templateSlideId,
"pageType": 'SLIDE'
}
);
测试 3:错误:'requests[0]' 处的未知名称“SlideProperties”:找不到字段。
requests.push(
{'SlideProperties': {
"layoutObjectId": templateSlideId
}}
);
问题:
是否可以将文本插入现有幻灯片中的现有 table?
我真的不想使用批量更新来更改我的模板/模型中的所有尺寸和颜色table。
@Aerials 发布有没有办法(或解决方法)使用应用程序脚本将 Google 表格中的 table 添加到 Google 幻灯片演示文稿?
他 1) 创建了幻灯片,2) 添加了 table,3) 填充了 table.
我看过的另一个想法https://developers.google.com/slides/api/guides/styling#inserting_deleting_or_replacing_text描述了在插入之前删除文本但是如果没有要删除的文本?
我编写了 运行 代码以使用 table 创建幻灯片,然后使用 for 循环填充文本 运行s 并创建填充了 table 的幻灯片。它 运行,用 table 创建了幻灯片,但出现错误,生成的幻灯片不令人满意。
let newSlideId = Utilities.getUuid();
requests.push(
{"createSlide": {
"objectId": newSlideId,
"insertionIndex": 0,
"slideLayoutReference": {
"predefinedLayout": "BLANK"
}
}
},
{ "createTable": {
"objectId": theTblId, // this id is in use on template slide but will be unique on this new slide
"elementProperties": {
"pageObjectId": newSlideId
},
"rows": 9,
"columns": 9
}
}
);
console.log('number of updates: ', requests.length);
if (requests.length > 0) {
response = Slides.Presentations.batchUpdate(
{ 'requests': requests }, templatePresId );
}
console.log('table created in new slide');
requests =[];
table 被许多白色 space 包围。列和行的大小错误,我必须添加背景颜色。批量更新将最小行和列/宽度和高度限制为 32 像素,这太大了。我正在教学并希望 table 填满幻灯片以便可以看到。这就是为什么我想使用现有模型 table.
但是,错误:服务不可用:幻灯片
在上面显示的代码之后没有其他代码 运行,所以不知道这是从哪里来的。因为我不喜欢结果 - 我不在乎。
===================================
开始回复科斯的建议
代码:
function insertText(inArr) {
console.log('Begin insertText' );
console.log(inArr );
const ui = SpreadsheetApp.getUi();
let templatePres = SlidesApp.openById(templatePresId);
let slidesArr = templatePres.getSlides();
let templateSlideId = slidesArr[0].getObjectId();
console.log('templateSlideId: ', templateSlideId );
let tblArr = slidesArr[0].getTables();
let theTblId = tblArr[0].getObjectId(); // table page element
console.log('theTblId: ', theTblId );
let requests =[]
,numRows = 8, numCols = 8
,r, c, nextReq, nextVal
,theTableCellObj ,theTableRowObj ,theTableObj ,thePageElement
for ( let c = 0 ; c < 8 ; c++ ) {
for ( let r = 0 ; r < 8 ; r++ ) {
requests.push(
{"insertText":
{"objectId": theTblId
,"cellLocation": {
"rowIndex": r
,"columnIndex": c
}
,"text": inArr[r][c].toString()
// ,"text": inArr[r][c]
}
}
);
}
}
console.log('number of updates: ', requests.length);
if (requests.length > 0) {
response = Slides.Presentations.batchUpdate(
{ 'requests': requests }, templatePresId );
}
console.log('End insertText' );
}
日志:
Aug 4, 2021, 1:39:22 PM Debug ?slide=id.ge1649b52bc_0_0 slide[0] id: SLIDES_API2065850924_0
Aug 4, 2021, 1:39:23 PM Debug Begin insertText
Aug 4, 2021, 1:39:23 PM Debug [ [ ' ', ' ', 'A', 'B', 'C', 'D', 'E', 'F', ' ' ],
[ ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ' ],
[ '1', ' ', 'zub', 'jip', 'kep', 'belm', 'frel', 'ras', ' ' ],
[ '2', ' ', 'drelf', 'bilp', 'bel', 'crift', 'posk', 'qualt', ' ' ],
[ '3', ' ', 'frusp', 'julm', 'hes', 'trin', 'taft', 'rop', ' ' ],
[ '4', ' ', 'sit', 'lit', 'trus', 'gub', 'buct', 'bloct', ' ' ],
[ '5', ' ', 'mef', 'dolp', 'hush', 'glap', 'crit', 'clack', ' ' ],
[ '6', ' ', 'crulp', 'gelt', 'quelm', 'dap', 'memp', 'rift', ' ' ],
[ ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ' ] ]
Aug 4, 2021, 1:39:23 PM Debug templateSlideId: SLIDES_API1629452804_0
Aug 4, 2021, 1:39:23 PM Debug theTblId: SLIDES_API1629452804_1
Aug 4, 2021, 1:39:23 PM Debug number of updates: 64
Aug 4, 2021, 1:39:24 PM Error GoogleJsonResponseException: API call to slides.presentations.batchUpdate failed with error: Invalid requests[0].insertText: The object (SLIDES_API1629452804_1) could not be found.
at insertText(Code:243:37)
at makeMockup(Code:78:3)
在 1:39:23 下午调试 TblId:SLIDES_API1629452804_1
table 已找到并记录
在 1:39:24 PM 错误 GoogleJsonResponseException:API 调用 slides.presentations.batchUpdate 失败,错误:请求无效 [0].insertText:对象(SLIDES_API1629452804_1) 找不到。
我在 insertText 命令中使用了 table id,但找不到它。我认为这是因为没有输入幻灯片 ID,因此尝试了更复杂的 batchUpdate,但它也不起作用。
结束对 Kos 的回复
HISTORY - 我想从电子表格中的列表创建一个 table,它将填充 Google 幻灯片或 Jamboard 的背景。
方法1.在与列表相同的电子表格中创建table并用于教学。问题:电子表格的所有工具栏都吃完了吗
space 在小型学生设备上。
方法 2。不支持:将 table(电子表格中的 运行ge 个单元格)提取为图像并加载到幻灯片背景。我在 Google 电子表格中找不到任何函数来执行此操作。可能在 Excel?
方法 3. 在与列表相同的电子表格中创建一个 table,在电子表格中阅读 'some' table 的特征。创建一张幻灯片,插入一个 table 并使用电子表格中 table 的特征可用的有限数据(包括文本)对其进行格式化。从幻灯片中下载 table 作为图像并将其作为背景图像上传。结果 table(对于 9x9)比幻灯片大。将图像加载到幻灯片时,table 被无用的白色 space 包围并且大部分未格式化。
“
方法 4。不支持:从前 36 项数据创建一个数组。手动创建带有 table 的幻灯片,并使用尽可能有限的属性对其进行格式化。在没有批量更新的幻灯片上使用简单更新 table。 theTbl.getCell 没有设置或插入方法。
方法5.获取错误:从前36项数据创建一个数组。手动创建带有 table 的幻灯片,并使用尽可能有限的属性对其进行格式化。使用简单的批量更新 insertText 将数组中的文本填充到幻灯片 table 中。下载 table 作为图像并将其作为背景图像上传。这与方法三不同,因为幻灯片上的 table 已经存在。这是@Kos 在他的 'answer' 中讨论的方法。查看上面的错误(搜索 Kos)
方法 6. 获取错误:从数据创建一个数组。创建具有漂亮样式和文本属性的模型的幻灯片副本。使用复杂的批量更新将数组中的文本填充到幻灯片 table 中。下载为图像并另存为新幻灯片或现有演示文稿中的背景。删除所有临时的东西。查看上面的错误(顶部示例)
您可能已经注意到我选择了一个不幸的用户名。我只有85分,我冒着50分的风险来回答!
你的代码是正确的,除了你在这里遗漏了一点:
It gets the error: GoogleJsonResponseException: API call to slides.presentations.batchUpdate failed with error: Invalid requests[0].insertText: The object (SLIDES_API1834905201_1) could not be found.
SLIDES_API1834905201_1 is the id of the existing slide with the mockup table. The above request contains the presentation id and the page element / table id but there is no place to enter the slide id???
insertText
请求的 objectId
不应像您想象的那样是幻灯片 ID,而是 table 的 ID。将此修复为正确的对象 ID 将允许应用请求。
objectId
- string
The object ID of the shape or table where the text will be inserted.
首先,它不会起作用,因为您调用了错误的幻灯片! :)
当您复制幻灯片时,您现在必须填写第二张幻灯片,而不是第一张。
function populateMockupTable(inArr) {
console.log('Begin populateMockupTable' );
// console.log(inArr);
const ui = SpreadsheetApp.getUi();
let templatePres, slidesArr, tblArr;
try {
templatePres = SlidesApp.openById(templatePresId);
} catch ( err) {
ui.alert('You do not have a presentation. Ending.');
return;
}
try {
slidesArr = templatePres.getSlides();
} catch ( err) {
ui.alert('Could not get slides from presentation. Ending.');
return;
}
let templateSlideId = slidesArr[1].getObjectId();
// console.log('templateSlideId: ', templateSlideId );
try {
tblArr = ***slidesArr[1]***.getTables();
} catch ( err) {
ui.alert('Could not get slides from presentation. Ending.');
return;
}
let theTblId = tblArr[0].getObjectId(); // table page element
// console.log('theTblId: ', theTblId );
let requests =[], numRows = inArr.length, numCols = inArr[0].length, r, c;
for ( let r = 0 ; r < numRows ; r++ ) {
for ( let c = 0 ; c < numCols ; c++ ) {
requests.push(
{"insertText":
{"objectId": theTblId
,"cellLocation": {
"rowIndex": r,
"columnIndex": c
}
,"text": inArr[r][c].toString()
}
}
);
}
}
// console.log('number of updates: ', requests.length);
if (requests.length > 0) {
var response = Slides.Presentations.batchUpdate(
{ 'requests': requests }, templatePresId );
}
// console.log('End populateMockupTable' );
// console.log(requests);
}
这是一个简单的解决方案,您可以利用现有的 table 或 Google 幻灯片并在任何需要的地方合并数据。例如:
// Create the text merge (replaceAllText) requests for this presentation.
let requests = [{
replaceAllText: {
containsText: {
text: '{{customer-name}}',
matchCase: true
},
replaceText: customerName //Here the variable with data
}
}, {
replaceAllText: {
containsText: {
text: '{{case-description}}',
matchCase: true
},
replaceText: caseDescription //Here the variable with data
}
}, {
replaceAllText: {
containsText: {
text: '{{total-portfolio}}',
matchCase: true
},
replaceText: totalPortfolio + '' //Here de variable with data
}
}];
// Execute the requests for this presentation.
var result = Slides.Presentations.batchUpdate({
requests: requests
}, presentationId);
对我有用
文档:
https://developers.google.com/slides/api/guides/merge#apps-script
问题:如何将文本插入 Google 幻灯片中现有 table 的单元格中?
我有一个现有的演示文稿,其中包含一个模型 table,其中包含所需的所有尺寸和颜色。它不包含任何文本。这是我 运行 尝试填充 table.
的代码 let templatePres = SlidesApp.openById(templatePresId);
let slidesArr = templatePres.getSlides();
let templateSlideId = slidesArr[0].getObjectId();
let tblArr = slidesArr[0].getTables();
let theTblId = tblArr[0].getObjectId(); // table page element
let requests =[]
,numRows = 8, numCols = 8
,r, c, nextReq, nextVal
,theTableCellObj ,theTableRowObj ,theTableObj ,thePageElement
for ( c = 0 ; c < numCols ; c++ ) {
for ( r = 0 ; r < numRows ; r++ ) {
theTableCellObj =
{
"location": {
"rowIndex": r
,"columnIndex": c
},
"text": { nextVal }
};
theTableRowObj =
{
"tableCells": [ theTableCellObj ]
}
theTableObj =
{
"rows": numRows,
"columns": numCols,
"tableRows": [ theTableRowObj ]
}
thePageElement =
{
"objectId": theTblId,
"table": theTableObj
};
nextVal = inArr[r][c].toString();
console.log('r: ', r, ' c: ', c, ' val: ', nextVal );
nextReq =
{
"objectId": templateSlideId,
"pageType": 'SLIDE',
"pageElements": [thePageElement]
}
requests.push(nextReq);
console.log(JSON.stringify(nextReq) );
}
}
batchUpdate 中每个请求的错误如下所示:
GoogleJsonResponseException: API call to slides.presentations.batchUpdate failed with error: Invalid JSON payload received. Unknown name "pageElements" at 'requests[0]': Cannot find field.
Invalid JSON payload received. Unknown name "pageType" at 'requests[0]': Cannot find field.
Invalid JSON payload received. Unknown name "objectId" at 'requests[0]': Cannot find field.
Invalid JSON payload received. Unknown name "pageElements" at 'requests[1]': Cannot find field.
Invalid JSON payload received. Unknown name "pageType" at 'requests[1]': Cannot find field.
...
这是console.log显示的典型请求:
{
"objectId": "SLIDES_API142383606_0"
, "pageType": "SLIDE"
, "pageElements":
[
{
"objectId": "SLIDES_API142383606_1"
, "table":
{
"rows": 8
, "columns": 8
, "tableRows": [
{
"tableCells": [
{
"location": { "rowIndex": 3, "columnIndex": 2 }
,"text": { "nextVal": "silf" }
}
]
}
]
}
}
]
}
我使用了文档,但我觉得很难。任何帮助表示赞赏。
我添加了一些日志来证明获取ids不是问题。
try {
templatePres = SlidesApp.openById(templatePresId);
} catch ( err) {
ui.alert('You do not have a presentation. Ending.');
return;
}
try {
slidesArr = templatePres.getSlides();
} catch ( err) {
ui.alert('Could not get slides from presentation. Ending.');
return;
}
let templateSlideId = slidesArr[0].getObjectId();
console.log('templateSlideId: ', templateSlideId );
try {
tblArr = slidesArr[0].getTables();
} catch ( err) {
ui.alert('Could not get slides from presentation. Ending.');
return;
}
let theTblId = tblArr[0].getObjectId(); // table page element
console.log('ttheTblId: ', theTblId );
这是日志显示:
templateSlideId: SLIDES_API1369298387_0
ttheTblId: SLIDES_API1369298387_1 // typo did not affect result
除非你很好奇,否则不要费心看下面的愚蠢想法
下面之前的尝试没有成功,因为我找不到输入幻灯片 ID 的方法。
第一步:我在现有的演示文稿中复制一份,这样我就可以在不弄乱原件的情况下添加文本。
// https://www.debugcn.com/en/article/18027667.html
let slide0 = templatePres.getSlideById(templateSlideId)
// templatePres.insertSlide(insertionIndex, slide)
templatePres.insertSlide(0, slide0);
这张临时幻灯片将填充文本,以 png 格式下载并作为背景插入到最终演示文稿中。
第二步:在临时幻灯片上填充文本w/o批量更新:
for ( let r = 0 ; r < 9 ; r++ ) {
for ( let c = 0 ; c < 9 ; r++ ) {
theTbl.getCell(r, c). ??? there are no sets or inserts
}
}
以上内容将不起作用,因为没有文本集或插入。
第二步:使用批量更新填充临时幻灯片上的文本:
构建批处理更新请求:
for ( let c = 0 ; c < 8 ; c++ ) {
for ( let r = 0 ; r < 8 ; r++ ) {
requests.push(
{"insertText":
{"objectId": theTblId
,"cellLocation": {
"rowIndex": r
,"columnIndex": c
}
,"text": inArr[r][c].toString()
// ,"text": inArr[r][c]
}
}
);
}
}
if (requests.length > 0) {
response = Slides.Presentations.batchUpdate(
{ 'requests': requests }, templatePresId );
}
它收到错误:GoogleJsonResponseException:API 调用 slides.presentations.batchUpdate 失败,出现错误:请求无效 [0].insertText:对象(SLIDES_API1834905201_1) 找不到。
SLIDES_API1834905201_1 是模型 table 的现有幻灯片的 ID。上面的请求包含了presentation id和page element/table id但是没有地方输入slide id???
我尝试将这些请求中的每一个分别添加到 insertText 请求之前的请求数组中,作为识别幻灯片的一种方式,但显然我不理解文档中的语法。列出了错误。
测试 1 错误:'requests[0]' 处的未知名称“页面”:找不到字段。
requests.push(
{'Page': {
"objectId": templateSlideId,
"pageType": 'SLIDE'
}}
);
测试 2:错误:未知名称“pageType”位于 'requests[0]':找不到字段。 收到无效的 JSON 负载。 'requests[0]' 处的未知名称“objectId”:找不到字段。
requests.push(
{
"objectId": templateSlideId,
"pageType": 'SLIDE'
}
);
测试 3:错误:'requests[0]' 处的未知名称“SlideProperties”:找不到字段。
requests.push(
{'SlideProperties': {
"layoutObjectId": templateSlideId
}}
);
问题: 是否可以将文本插入现有幻灯片中的现有 table?
我真的不想使用批量更新来更改我的模板/模型中的所有尺寸和颜色table。
@Aerials 发布有没有办法(或解决方法)使用应用程序脚本将 Google 表格中的 table 添加到 Google 幻灯片演示文稿?
我看过的另一个想法https://developers.google.com/slides/api/guides/styling#inserting_deleting_or_replacing_text描述了在插入之前删除文本但是如果没有要删除的文本?
我编写了 运行 代码以使用 table 创建幻灯片,然后使用 for 循环填充文本 运行s 并创建填充了 table 的幻灯片。它 运行,用 table 创建了幻灯片,但出现错误,生成的幻灯片不令人满意。
let newSlideId = Utilities.getUuid();
requests.push(
{"createSlide": {
"objectId": newSlideId,
"insertionIndex": 0,
"slideLayoutReference": {
"predefinedLayout": "BLANK"
}
}
},
{ "createTable": {
"objectId": theTblId, // this id is in use on template slide but will be unique on this new slide
"elementProperties": {
"pageObjectId": newSlideId
},
"rows": 9,
"columns": 9
}
}
);
console.log('number of updates: ', requests.length);
if (requests.length > 0) {
response = Slides.Presentations.batchUpdate(
{ 'requests': requests }, templatePresId );
}
console.log('table created in new slide');
requests =[];
table 被许多白色 space 包围。列和行的大小错误,我必须添加背景颜色。批量更新将最小行和列/宽度和高度限制为 32 像素,这太大了。我正在教学并希望 table 填满幻灯片以便可以看到。这就是为什么我想使用现有模型 table.
但是,错误:服务不可用:幻灯片 在上面显示的代码之后没有其他代码 运行,所以不知道这是从哪里来的。因为我不喜欢结果 - 我不在乎。
=================================== 开始回复科斯的建议
代码:
function insertText(inArr) {
console.log('Begin insertText' );
console.log(inArr );
const ui = SpreadsheetApp.getUi();
let templatePres = SlidesApp.openById(templatePresId);
let slidesArr = templatePres.getSlides();
let templateSlideId = slidesArr[0].getObjectId();
console.log('templateSlideId: ', templateSlideId );
let tblArr = slidesArr[0].getTables();
let theTblId = tblArr[0].getObjectId(); // table page element
console.log('theTblId: ', theTblId );
let requests =[]
,numRows = 8, numCols = 8
,r, c, nextReq, nextVal
,theTableCellObj ,theTableRowObj ,theTableObj ,thePageElement
for ( let c = 0 ; c < 8 ; c++ ) {
for ( let r = 0 ; r < 8 ; r++ ) {
requests.push(
{"insertText":
{"objectId": theTblId
,"cellLocation": {
"rowIndex": r
,"columnIndex": c
}
,"text": inArr[r][c].toString()
// ,"text": inArr[r][c]
}
}
);
}
}
console.log('number of updates: ', requests.length);
if (requests.length > 0) {
response = Slides.Presentations.batchUpdate(
{ 'requests': requests }, templatePresId );
}
console.log('End insertText' );
}
日志:
Aug 4, 2021, 1:39:22 PM Debug ?slide=id.ge1649b52bc_0_0 slide[0] id: SLIDES_API2065850924_0
Aug 4, 2021, 1:39:23 PM Debug Begin insertText
Aug 4, 2021, 1:39:23 PM Debug [ [ ' ', ' ', 'A', 'B', 'C', 'D', 'E', 'F', ' ' ],
[ ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ' ],
[ '1', ' ', 'zub', 'jip', 'kep', 'belm', 'frel', 'ras', ' ' ],
[ '2', ' ', 'drelf', 'bilp', 'bel', 'crift', 'posk', 'qualt', ' ' ],
[ '3', ' ', 'frusp', 'julm', 'hes', 'trin', 'taft', 'rop', ' ' ],
[ '4', ' ', 'sit', 'lit', 'trus', 'gub', 'buct', 'bloct', ' ' ],
[ '5', ' ', 'mef', 'dolp', 'hush', 'glap', 'crit', 'clack', ' ' ],
[ '6', ' ', 'crulp', 'gelt', 'quelm', 'dap', 'memp', 'rift', ' ' ],
[ ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ' ] ]
Aug 4, 2021, 1:39:23 PM Debug templateSlideId: SLIDES_API1629452804_0
Aug 4, 2021, 1:39:23 PM Debug theTblId: SLIDES_API1629452804_1
Aug 4, 2021, 1:39:23 PM Debug number of updates: 64
Aug 4, 2021, 1:39:24 PM Error GoogleJsonResponseException: API call to slides.presentations.batchUpdate failed with error: Invalid requests[0].insertText: The object (SLIDES_API1629452804_1) could not be found.
at insertText(Code:243:37)
at makeMockup(Code:78:3)
在 1:39:23 下午调试 TblId:SLIDES_API1629452804_1 table 已找到并记录
在 1:39:24 PM 错误 GoogleJsonResponseException:API 调用 slides.presentations.batchUpdate 失败,错误:请求无效 [0].insertText:对象(SLIDES_API1629452804_1) 找不到。
我在 insertText 命令中使用了 table id,但找不到它。我认为这是因为没有输入幻灯片 ID,因此尝试了更复杂的 batchUpdate,但它也不起作用。
结束对 Kos 的回复
HISTORY - 我想从电子表格中的列表创建一个 table,它将填充 Google 幻灯片或 Jamboard 的背景。
方法1.在与列表相同的电子表格中创建table并用于教学。问题:电子表格的所有工具栏都吃完了吗 space 在小型学生设备上。
方法 2。不支持:将 table(电子表格中的 运行ge 个单元格)提取为图像并加载到幻灯片背景。我在 Google 电子表格中找不到任何函数来执行此操作。可能在 Excel?
方法 3. 在与列表相同的电子表格中创建一个 table,在电子表格中阅读 'some' table 的特征。创建一张幻灯片,插入一个 table 并使用电子表格中 table 的特征可用的有限数据(包括文本)对其进行格式化。从幻灯片中下载 table 作为图像并将其作为背景图像上传。结果 table(对于 9x9)比幻灯片大。将图像加载到幻灯片时,table 被无用的白色 space 包围并且大部分未格式化。
“ 方法 4。不支持:从前 36 项数据创建一个数组。手动创建带有 table 的幻灯片,并使用尽可能有限的属性对其进行格式化。在没有批量更新的幻灯片上使用简单更新 table。 theTbl.getCell 没有设置或插入方法。 方法5.获取错误:从前36项数据创建一个数组。手动创建带有 table 的幻灯片,并使用尽可能有限的属性对其进行格式化。使用简单的批量更新 insertText 将数组中的文本填充到幻灯片 table 中。下载 table 作为图像并将其作为背景图像上传。这与方法三不同,因为幻灯片上的 table 已经存在。这是@Kos 在他的 'answer' 中讨论的方法。查看上面的错误(搜索 Kos) 方法 6. 获取错误:从数据创建一个数组。创建具有漂亮样式和文本属性的模型的幻灯片副本。使用复杂的批量更新将数组中的文本填充到幻灯片 table 中。下载为图像并另存为新幻灯片或现有演示文稿中的背景。删除所有临时的东西。查看上面的错误(顶部示例)您可能已经注意到我选择了一个不幸的用户名。我只有85分,我冒着50分的风险来回答!
你的代码是正确的,除了你在这里遗漏了一点:
It gets the error: GoogleJsonResponseException: API call to slides.presentations.batchUpdate failed with error: Invalid requests[0].insertText: The object (SLIDES_API1834905201_1) could not be found.
SLIDES_API1834905201_1 is the id of the existing slide with the mockup table. The above request contains the presentation id and the page element / table id but there is no place to enter the slide id???
insertText
请求的 objectId
不应像您想象的那样是幻灯片 ID,而是 table 的 ID。将此修复为正确的对象 ID 将允许应用请求。
objectId
-string
The object ID of the shape or table where the text will be inserted.
首先,它不会起作用,因为您调用了错误的幻灯片! :) 当您复制幻灯片时,您现在必须填写第二张幻灯片,而不是第一张。
function populateMockupTable(inArr) {
console.log('Begin populateMockupTable' );
// console.log(inArr);
const ui = SpreadsheetApp.getUi();
let templatePres, slidesArr, tblArr;
try {
templatePres = SlidesApp.openById(templatePresId);
} catch ( err) {
ui.alert('You do not have a presentation. Ending.');
return;
}
try {
slidesArr = templatePres.getSlides();
} catch ( err) {
ui.alert('Could not get slides from presentation. Ending.');
return;
}
let templateSlideId = slidesArr[1].getObjectId();
// console.log('templateSlideId: ', templateSlideId );
try {
tblArr = ***slidesArr[1]***.getTables();
} catch ( err) {
ui.alert('Could not get slides from presentation. Ending.');
return;
}
let theTblId = tblArr[0].getObjectId(); // table page element
// console.log('theTblId: ', theTblId );
let requests =[], numRows = inArr.length, numCols = inArr[0].length, r, c;
for ( let r = 0 ; r < numRows ; r++ ) {
for ( let c = 0 ; c < numCols ; c++ ) {
requests.push(
{"insertText":
{"objectId": theTblId
,"cellLocation": {
"rowIndex": r,
"columnIndex": c
}
,"text": inArr[r][c].toString()
}
}
);
}
}
// console.log('number of updates: ', requests.length);
if (requests.length > 0) {
var response = Slides.Presentations.batchUpdate(
{ 'requests': requests }, templatePresId );
}
// console.log('End populateMockupTable' );
// console.log(requests);
}
这是一个简单的解决方案,您可以利用现有的 table 或 Google 幻灯片并在任何需要的地方合并数据。例如:
// Create the text merge (replaceAllText) requests for this presentation.
let requests = [{
replaceAllText: {
containsText: {
text: '{{customer-name}}',
matchCase: true
},
replaceText: customerName //Here the variable with data
}
}, {
replaceAllText: {
containsText: {
text: '{{case-description}}',
matchCase: true
},
replaceText: caseDescription //Here the variable with data
}
}, {
replaceAllText: {
containsText: {
text: '{{total-portfolio}}',
matchCase: true
},
replaceText: totalPortfolio + '' //Here de variable with data
}
}];
// Execute the requests for this presentation.
var result = Slides.Presentations.batchUpdate({
requests: requests
}, presentationId);
对我有用
文档:
https://developers.google.com/slides/api/guides/merge#apps-script