【问题标题】:Google slides auto update links /tables linked from google sheet谷歌幻灯片自动更新链接/从谷歌表链接的表格
【发布时间】:2018-02-21 02:02:09
【问题描述】:

我有一个 Google 幻灯片演示文稿,其中有一些链接到 Google 表格中的数据的单元格/表格。目前,我必须手动单击每个链接的单元格/表格来更新值。 我需要一个用于自动更新/批量更新/刷新这些链接的 Google 幻灯片脚本,以便值/表格自动更新。这可能吗?

【问题讨论】:

标签: google-apps-script google-sheets google-slides-api google-slides data-linking


【解决方案1】:

是也不是。

图表

是的!可以批量更新:

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://stackoverflow.com/a/48254442/

形状/表格

没有:https://issuetracker.google.com/issues/64027131

2019 年 5 月 24 日来自 Google 的更新

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

【讨论】:

  • 大家好@Kos。我曾尝试为 Google Document 实现此代码,但它不起作用。我已将此代码更改为“DocumentApp”而不是“SlideApp”并尝试重写它,但我不能,而且我没有找到关于 Google Docs 的有关此问题的参考。我需要一些关于如何做到这一点的信息。谢谢。
  • 我试过'DocumentApp.getUi()'和'var gotSlides = DocumentApp.getActiveDocument().getBody();',但没有奏效。菜单栏没问题,似乎正在运行,但没有更新图表。
  • @IvanSinigaglia 我刚刚编辑了原始问题,您可以向原始回答者提出这个问题 - Tredecies
【解决方案2】:

有人让这个工作吗?

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 表格中的有效图表。”

【讨论】:

  • 确保图表有任何链接;使用getLink() 检查是否为空
【解决方案3】:

以下示例设置假设有五张带有一些链接图表的幻灯片:

  • 第一张幻灯片 - 主幻灯片标题/副标题(无图表)
  • 第二张幻灯片 - 包含从数据透视表的图表链接的图表,该图表计算了研发人员以及他们计划从 Google 表单回复表中执行的操作
  • 第三张幻灯片 - 包含从数据透视表的图表链接的图表,该图表计算 IME 员工以及他们计划从 Google 表单回复表中执行的操作
  • 第四张幻灯片 - 包含从数据透视表的图表链接的图表,该图表计算 PMO 工作人员以及他们计划从 Google 表单回复表中执行的操作
  • 第五张幻灯片 - 包含从数据透视表的图表链接的图表,该图表计算员工总数以及他们计划从 Google 表单回复表中执行的操作

下面的函数将使用链接图表更新幻灯片。 它需要高级 Google 服务:Google Slides API https://developers.google.com/slides/

您可以从您的 Google Apps 脚本 IDE 中的Resources &gt; Advanced Google Services... &gt; Google Slides API 激活此高级功能。 API 版本设置为v1。如果不启用,脚本会报错Slides is not defined at updateSlideCharts(...)

有关 Google Slides 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());
}

【讨论】:

    【解决方案4】:

    链接表

    截至 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 类的文档。

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

    另请参阅this answer 以获得更简单的解决方法(但它不会传输单元格格式)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-09
      • 1970-01-01
      • 2023-01-26
      • 1970-01-01
      • 1970-01-01
      • 2021-02-04
      • 1970-01-01
      相关资源
      最近更新 更多