谷歌幻灯片自动更新从谷歌表格链接的链接/表格

4

我有一个Google Slides演示文稿,其中包含一些链接到Google Sheets中数据的单元格/表格。目前,我必须手动单击每个链接的单元格/表格以更新值。

我需要一个Google Slides脚本,可以自动更新/批量更新/刷新这些链接,以便值/表格得到自动更新。这是否可能?


https://stackoverflow.com/help/mcve - Chris
4个回答

4

既是肯定也是否定。

图表

可以!这些可以批量更新:

function onOpen() {

SlidesApp.getUi() // Or DocumentApp or FormApp.
    .createMenu('Update Charts')
    .addItem("Update now !!!!!", 'refreshCharts').addToUi();
}

function refreshCharts(){
    var gotSlides = SlidesApp.getActivePresentation().getSlides();

    for (var i = 0; i < gotSlides.length; i++) {
        var slide = gotSlides[i];
        var sheetsCharts = slide.getSheetsCharts();

        for (var k = 0; k < sheetsCharts.length; k++) {
            var shChart = sheetsCharts[k];
            shChart.refresh();
        }
    }
}

来源: https://dev59.com/8qLia4cB1Zd3GeqPkILg#48254442/

形状 / 表格

编号: https://issuetracker.google.com/issues/64027131

来自谷歌的更新 2019年5月24日

https://gsuiteupdates.googleblog.com/2019/05/bulk-update-docs-slides.html


大家好,@Kos和所有人。我尝试实现这段Google文档代码,但它不起作用。我已经将"SlideApp"替换为"DocumentApp"并尝试重写它,但我无法做到,并且我没有找到任何关于Google文档的此问题的参考资料。我需要一些关于如何解决这个问题的帮助。谢谢。 - Ivan Sinigaglia
我尝试过使用“DocumentApp.getUi()”和“var gotSlides = DocumentApp.getActiveDocument().getBody();”,但都没有起作用。菜单栏可以正常显示并运行,但没有任何图表被更新。 - Ivan Sinigaglia
@IvanSinigaglia 我刚刚编辑了原始问题,你可以向原始回答者Tredecies提出这个问题。 - Kos

1

链接表

截至2021年8月,对于链接表来说仍然没有.refresh()函数可用,但如果您的使用情况允许您在编写脚本时知道源电子表格和范围,则可以通过从电子表格中读取文本值、字体颜色、字体样式等信息并将其写入表格来更新链接表。类似这样:

 function updateSheetsChart()
{
  // The range on the source spreadsheet
  var sourceRange = SpreadsheetApp.openById(SOURCE_SPREADSHEET_ID).getRange(SOURCE_TABLE_RANGE)
  var source = {
    'values': sourceRange.getDisplayValues(),
    'backgrounds': sourceRange.getBackgrounds(),
    'textStyles': sourceRange.getTextStyles(),
    'fontColors': sourceRange.getFontColors()
  }
  // The linked table on the presentation
  var table = SlidesApp.getActivePresentation().getPageElementById(SHEETS_TABLE_OBJECT_ID).asTable()
  var columnCount = table.getNumColumns()
  var rowCount = table.getNumRows()
  for (var col = 0; col < columnCount; col++)
  {
    for (var row = 0; row < rowCount; row++)
    {
      var cell = table.getCell(row, col)
      // Cell text
      var cellText = cell.getText()
      cellText.setText(source.values[row][col])
      // Background color
      cell.getFill().setSolidFill(source.backgrounds[row][col])
      // Font style (bold)
      var cellTextStyle = cellText.getTextStyle()
      cellTextStyle.setBold(source.textStyles[row][col].isBold())
      // Text color
      cellTextStyle.setForegroundColor(source.fontColors[row][col])
    }
  }
}

您可以添加更多行来设置字体大小、斜体、链接URL等。请参阅RangeSheets TextStyleSlides TextStyle类的文档以获取相应的方法。

有很多限制:例如,它不会复制完整的富文本(一个单元格中的多个颜色或字体样式)。

此外,还可以查看此答案以获取更简单的解决方法(但它不会传输单元格格式)。


0

有人成功地让这个工作了吗?

function refreshCharts(){
var gotSlides = SlidesApp.getActivePresentation().getSlides();

for (var i = 0; i < gotSlides.length; i++) {
    var slide = gotSlides[i];
    var sheetsCharts = slide.getSheetsCharts();

    for (var k = 0; k < sheetsCharts.length; k++) {
        var shChart = sheetsCharts[k];
        shChart.refresh();
    }
}
}

我刚刚收到这个错误信息:

"

无法刷新图表。请验证该图表在Google Sheets中是否有效。

"

确保图表有任何链接;使用 getLink() 检查是否为空。 - ecle

0

以下示例设置假设有五个幻灯片,其中包含一些链接的图表:

  • 第一张幻灯片 - 主要幻灯片标题/副标题(无图表)
  • 第二张幻灯片 - 包含一个图表,该图表链接自透视表的图表,该透视表计算了来自Google表单响应表的研发人员及其计划
  • 第三张幻灯片 - 包含一个图表,该图表链接自透视表的图表,该透视表计算了来自Google表单响应表的IME工作人员及其计划
  • 第四张幻灯片 - 包含一个图表,该图表链接自透视表的图表,该透视表计算了来自Google表单响应表的PMO工作人员及其计划
  • 第五张幻灯片 - 包含一个图表,该图表链接自透视表的图表,该透视表计算了总工作人员及其计划来自Google表单响应表

下面的函数将更新带有链接图表的幻灯片。 为使其正常工作,它需要高级谷歌服务:Google幻灯片API https://developers.google.com/slides/

您可以从您的Google Apps Script IDE中激活此高级功能,具体步骤为:资源 > 高级 Google 服务... > Google 幻灯片 API。API 版本设置为v1。如果您不启用它,脚本将会报错:在 updateSlideCharts(...) 中未定义幻灯片

有关 Google 幻灯片 API v1 中 RefreshSheetsChartRequest 的更多详细信息,请参见下面的链接:https://developers.google.com/slides/reference/rest/v1/presentations/request#RefreshSheetsChartRequest

function updateSlideCharts() {
  var presentation = SlidesApp.openById(YOUR_SLIDE_ID); //you need to get this slide id from your slide URL 
  //if empty
  if (presentation == null) throw new Error('Presentation was not found');
  Logger.log("%s id = %s", presentation.getName(), presentation.getId());
  
  var slides = presentation.getSlides();
  if (slides == null) throw new Error('Slides were not found');
  Logger.log("Total of slides in %s: %d", presentation.getName(), slides.length);
  

  var presentationId = presentation.getId();
  var presentationRndChartId = slides[1].getSheetsCharts()[0].getObjectId();
  Logger.log("ObjectId of \"%s\": %s", slides[1].getSheetsCharts()[0].getTitle(), presentationRndChartId);
  var presentationImeChartId = slides[2].getSheetsCharts()[0].getObjectId();
  Logger.log("ObjectId of \"%s\": %s", slides[2].getSheetsCharts()[0].getTitle(), presentationImeChartId);
  var presentationPmoChartId = slides[3].getSheetsCharts()[0].getObjectId();
  Logger.log("ObjectId of \"%s\": %s", slides[3].getSheetsCharts()[0].getTitle(), presentationPmoChartId);
  var presentationStaffChartId = slides[4].getSheetsCharts()[0].getObjectId();
  Logger.log("ObjectId of \"%s\": %s", slides[4].getSheetsCharts()[0].getTitle(), presentationStaffChartId);
  
  var requests = [{
    refreshSheetsChart: {
      objectId: presentationRndChartId
    }
  }];
  
  // Execute the request.
  var batchUpdateResponse = Slides.Presentations.batchUpdate({
    requests: requests
  }, presentationId);
  Logger.log('Refreshed linked Sheets charts for \"%s\"', slides[1].getSheetsCharts()[0].getTitle());

  requests = [{
    refreshSheetsChart: {
      objectId: presentationImeChartId
    }
  }];
  
  // Execute the request.
  batchUpdateResponse = Slides.Presentations.batchUpdate({
    requests: requests
  }, presentationId);
  Logger.log('Refreshed linked Sheets charts for \"%s\"', slides[2].getSheetsCharts()[0].getTitle());

  requests = [{
    refreshSheetsChart: {
      objectId: presentationPmoChartId
    }
  }];
  
  // Execute the request.
  batchUpdateResponse = Slides.Presentations.batchUpdate({
    requests: requests
  }, presentationId);
  Logger.log('Refreshed linked Sheets charts for \"%s\"', slides[3].getSheetsCharts()[0].getTitle());
  
  var requests = [{
    refreshSheetsChart: {
      objectId: presentationStaffChartId
    }
  }];
  
  // Execute the request.
  var batchUpdateResponse = Slides.Presentations.batchUpdate({
    requests: requests
  }, presentationId);
  Logger.log('Refreshed linked Sheets charts for \"%s\"', slides[4].getSheetsCharts()[0].getTitle());
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接