【问题标题】:How to get paragraphs in google doc from google spreadsheet table and create a link for document?如何从谷歌电子表格中获取谷歌文档中的段落并创建文档链接?
【发布时间】:2021-11-01 01:29:31
【问题描述】:

这是我发布的previous question 的延续。我是这个网站的新手,也是谷歌脚本的新手,请原谅我对脚本的了解。我有两个问题想问:

  1. 我被领导分配了一项任务,将表格从电子表格转换为 Google 文档中的段落。

基本上,我被指派将这组data 变成the expected output

虽然 Employee_ID工人信息 仅包含 1 个信息,但 GoalDescriptionSelf-EvaluationManager_Comment 可能有多行,每个人可能有不同的数字(即,有些人可能只有 1 个目标,其他一些可能有 2、3 甚至更多)。但是,我的任务是为每个人创建一个文件,因此我必须将每个人的所有目标、描述、自我评价和 manager_comment 放在一个文档中。

我应该使用什么脚本来实现这一点?

  1. 每次生成文档时,我还希望生成每个文档的链接并将其放入电子表格的选项卡中。在google script的帮助下,我希望能在这个标签页中自动打印每个员工的文档链接。我举了一些我所期望的例子here。请告知我可以使用什么脚本来实现这一点。

感谢您回答问题。非常感谢!

【问题讨论】:

  • 我必须为我糟糕的英语水平道歉。不幸的是,我无法理解“数据源”与“预期输出”和“文档应包括:”之间的关系。而且,我无法理解I also needed to generate a link to each document and paste it here.。我可以问你目标的细节吗?
  • 嗨@Tanaike 感谢您的及时回复。我已经改写了我的问题,我希望现在更清楚了。我很抱歉英语也不是我的第一语言。要回答您的问题,这与我在第一个线程中的问题相似,但是电子表格数据源表有点不同,预期输出也不同。我希望它能澄清你的问题,如果你需要更多的澄清,请随时告诉我。谢谢!
  • 感谢您回复并添加更多信息。我还有一个问题。您更新的问题中显示的当前目标是最终情况。在提出示例脚本后,您将不会改变您的目标。我的理解正确吗?因为当我看到您更新的输出情况时,它与您最初提供的示例输出情况有所不同。所以我很担心这个。我为此道歉。如果你想改变输出情况,请改变它。这个怎么样?
  • 大家好,我在这个问题中分享的数据样本和上一个不同。如果我将上一个问题中的脚本建议与这个新的数据源集一起使用,它将为每个人创建多个文档。虽然,我想每个人只创建一个文档。
  • 这是以前的数据集供您参考:docs.google.com/spreadsheets/d/…这是新的:(我也更改了标题名称)docs.google.com/spreadsheets/d/…这是新预期输出的链接,我添加了每个段落中的标题:docs.google.com/document/d/… 如果我还没有回答您的问题,我深表歉意。

标签: javascript google-apps-script google-sheets google-docs


【解决方案1】:

在这种情况下,为了达到你的目的,我将the sample script of your previous question修改如下。修改点如下。

  • 为了使用现有脚本,我为您的新情况转换了res的值。
  • 我添加了每个段落的段落名称。
  • 为了包含您的第二个请求,循环返回“Employee_ID”、“Worker”的值和创建的 Document 的 URL,并将这些值放入“Link”表。

当这些反映到示例脚本中时,它变成如下。

示例脚本:

function myFunction() {
  const title = "DOCUMENT TITLE";
  const sectionTitle = "SECTION TITLE";
  const head = ["ID: ", "EMPLOYEE NAME: "];

  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const [headers, ...rows] = ss.getSheetByName("Raw Data").getDataRange().getValues();
  let w = "";
  const res = rows.map((r, i) => {
    const obj = headers.reduce((o, h, j) => Object.assign(o, { [h]: r[j] }), {});
    if (i == 0) {
      w = obj["Worker"];
      return obj;
    }
    if (w != obj["Worker"]) {
      w = obj["Worker"];
    } else {
      obj["Worker"] = "";
      obj["Employee_ID"] = "";
    }
    return obj;
  });

  const lineBreak = body => body.appendParagraph("").editAsText().setBold(false).setFontSize(11);
  let body;
  const values = res.flatMap((e, i) =>
    headers.reduce((ar, h, j) => {
      if (e[h]) {
        if (j < 2) {
          if (j == 0) {
            const doc = DocumentApp.create(e["Worker"]);
            body = doc.getBody()
            body.appendParagraph(title).setHeading(DocumentApp.ParagraphHeading.HEADING1).editAsText().setBold(true).setFontSize(20);
            lineBreak(body);
            body.appendParagraph(head[j] + e[h]).editAsText().setBold(0, head[j].length - 1, true).setFontSize(11);
            ar.push([e["Employee_ID"], e["Worker"], doc.getUrl()]);
          } else if (j == 1) {
            body.appendParagraph(head[j] + e[h]).editAsText().setBold(0, head[j].length - 1, true).setFontSize(11);
            lineBreak(body);
            body.appendParagraph(sectionTitle).editAsText().setBold(true).setFontSize(14);
            lineBreak(body);
          }
        } else if (j == 2) {
          body.appendParagraph(e[h]).setHeading(DocumentApp.ParagraphHeading.HEADING2).editAsText().setBold(true).setFontSize(12);
          lineBreak(body);
        } else {
          body.appendParagraph(h + ":");
          body.appendParagraph(e[h]);
          lineBreak(body);
        }
      }
      return ar;
    }, [])
  );

  const dstSheet = ss.getSheetByName("Link");
  dstSheet.getRange("A2:C").clearContent();
  dstSheet.getRange(2, 1, values.length, values[0].length).setValues(values);
}

注意:

  • 此示例脚本来自您的示例 Google 电子表格和 Google 文档。更改这些内容后,可能无法使用此脚本。请注意这一点。

  • 很遗憾,我在您的示例输出文档中找不到“Employee_Comment:”。在这种情况下,是“Self_Evaluation”吗?这可以从示例电子表格的标题行中找到。我提议的脚本使用这个值。

参考资料:

【讨论】:

  • 我已经在我的实际数据源中尝试过这段代码,它正在工作!非常感谢!我已经接受了你的回答。不幸的是,我还不能投票,但是当我能够投票时,我会将您的答案选为最佳答案。非常感谢你的帮助!我真的很感激:D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多