【问题标题】:How can I inject data into Google Slides from Google Sheet? Append List or Direct Function?如何从 Google Sheet 将数据注入 Google Slides?追加列表还是直接函数?
【发布时间】:2021-09-01 07:23:48
【问题描述】:

我想从 Gsheet(this sheet 中的城市名称选项卡)中获取数据,并将这些数据直接输入到 Gslides 中的一些幻灯片中,例如 this template

在 Gsheet 中,数据在每个选项卡上的相同范围内,具有相同的标题。唯一改变的是选项卡名称。所以 [tab name]."{aaa}" 例如,其中 "{aaa}" 总是在同一个范围内。

Gslide 模板会从 Gsheet 中“接收”这些数据,并从以下任一位置获取数据:

  • [选项卡名称]之后的附加列表。“{header}”模型。
  • 如果我设法按照 [tab name]."{header}" 模型创建函数,则直接不创建此附加列表。

最终产品将是一个文件,用户可以在 Gsheet 文件中添加标签,按照模板(即城市名称和相同范围内的相同数据)并通过模板提供 Gslides,他们可以在其中输入他们想要的文本,遵循 [tab name].{header} 模型。

我的问题如下:

  • 哪种方法最好且资源消耗更少?
  • 如果我选择列表方法,如何使用我所有选项卡中的范围从 Gsheet 中附加一个列表,然后在 Gslide 的脚本中使用该列表?
  • 如何在 Gscript 中编写函数来填充我将要创建的幻灯片中的数据?

我已经开始在 stackoverflow 的帮助下编写以下代码,但我正在努力:

  • 我做事的顺序
  • 显然是附加列表模型/[选项卡名称]的函数。“{header}”模型
var NARRATIVE_SHEETS_URL ='xxx' // the URL of the Gsheet where the data is from
var SHEET_NAME = 'xxx' // this would be each tabs name;

function replaceMetric(pages) {
  var text_vals = getAutoValue(); 
  for (var i = 0; i < pages.length; i++) {
     var page = pages[i];
     replaceTextByAutoVal(page, text_vals);
  }
}

function replaceSelectedSlides() {
  var selection = SlidesApp.getActivePresentation().getSelection();  
  var selectionType = selection.getSelectionType();
  if (selectionType == SlidesApp.SelectionType.PAGE) {
    var pageRange = selection.getPageRange();
    var pages = pageRange.getPages();
    replaceMetric(pages);
  }
}

function replaceTextByAutoVal(slide, text_vals) {
  slide.replaceAllText("{aaa}", text_vals[0][0]);
  slide.replaceAllText("{bbb}", text_vals[1][0]);
  slide.replaceAllText("{ccc}", text_vals[2][0]);
  slide.replaceAllText("{ddd}", text_vals[3][0]);
  Logger.log("Replacement done");
} // This is the data that will always be in the same range for each tabs

function getAutoValue() {
  var ss = SpreadsheetApp.openByUrl(NARRATIVE_SHEETS_URL);
  var sheets = ss.getSheets() ;
  var valList = [];
  for (var i = 0; i < sheets.length; i++) {
        var sheet = sheets[i];

        Logger.log(sheet.getSheetName());
        const ignoreTabs = ["Presentation", "Start", "End", "Raw Data"];  // Tab names I want to ignore.
        if (ignoreTabs.includes(sheet.getSheetName())) {
          // do nothing
        } else {
          // do something
          Logger.log("found");
          var range = sheet.getRange("D3:D6");
          var values = range.getValues();
          valList.append(values);
          Logger.log(values)
          return values;
        }
  }  

}

【问题讨论】:

  • 我想说你的问题太宽泛了,它应该集中在一个特定的问题上。我会专注于将文本插入幻灯片,但是您决定将其插入。从这个意义上说,您能否直观地阐明数据在幻灯片中的结构和显示方式?
  • 我将有一个 Excel 数据表,每周更新一次,类似于这个,用户可以在其中添加与其城市相关的选项卡:docs.google.com/spreadsheets/d/… 根据幻灯片中显示的数据,它将是这样的,用户可以按照 [tab name].{header} 模型 docs.google.com/presentation/d/… 注入他们认为合适的数据
  • 谢谢,所以在这个例子中,我们的想法是替换例如[Paris].{aaa}8000 等等?演示文稿中的其余元素(带有文本框的幻灯片等)是否已经创建?它应该在演示文稿的每张幻灯片中查找[tab_name].{header} 模型?
  • 非常感谢您的帮助!是的,这个想法正是如此,例如在该示例中将 [Paris].{aaa} 替换为 8000。我将在 Gslide 中创建模板,我想做的是用从 Gsheet 数据中找到的任何[tab_name].{header} 来提供这些模板。

标签: google-apps-script


【解决方案1】:

解决办法:

在检索每个工作表的数据时,对其进行格式化,使其与占位符值相匹配,插入工作表名称和标题:

[tab_name].{header}

这可以通过以下方式完成(参见template literals):

const sheetData = values.map(row => [`[${sheetName}].{${row[0]}}`, row[1]]);

一旦你有了它,只需为每个标题使用Presentation.replaceAllText

另外,你只是抢专栏D;您也应该检索列E,例如D5:E8

代码示例:

function replaceSheetDataInSlides() {
  const ss = SpreadsheetApp.openByUrl(NARRATIVE_SHEETS_URL);
  const sheets = ss.getSheets() ;
  const valList = [];
  const ignoreTabs = ["Presentation", "Start", "End", "Raw Data"];  // Tab names I want to ignore.
  for (var i = 0; i < sheets.length; i++) {
    const sheet = sheets[i];
    const sheetName = sheet.getSheetName();
    if (!ignoreTabs.includes(sheetName)) {
      const range = sheet.getRange("D5:E8");
      const values = range.getValues();
      const sheetData = values.map(row => [`[${sheetName}].{${row[0]}}`, row[1]]);
      valList.push(...sheetData);
    }
  }
  const pres = SlidesApp.getActivePresentation();
  valList.forEach(value => pres.replaceAllText(value[0], value[1]));
}

【讨论】:

  • 你一定经常听到这个,但你是个天才!!!非常感谢您的帮助。
猜你喜欢
  • 2021-11-09
  • 1970-01-01
  • 2020-07-25
  • 2020-05-27
  • 1970-01-01
  • 2017-05-08
  • 2022-06-13
  • 2021-11-28
  • 1970-01-01
相关资源
最近更新 更多