请再看一遍: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 将允许应用请求。

来自documentation

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