如何从 google 电子表格 table 中获取 google 文档中的段落并为文档创建 link?
How to get paragraphs in google doc from google spreadsheet table and create a link for document?
这是我发布的 的延续。我是这个网站的新手,也是 google 脚本的新手,请原谅我对脚本的了解。我有两个问题想请教:
- 领导给我分配了一项任务,将 table 从电子表格转换为 google 文档中的段落。
基本上,我被分配到转这组data, into the expected output。
虽然Employee_ID和工人信息只包含1条信息, 目标、描述、自我评价和Manager_Comment 可能有多行,每个人可能有不同的数字(即有些人可能只有 1 个目标,有些人可能有 2、3 甚至更多)。然而,我的任务是为每个人创建一个文件,因此我必须将每个人的所有目标、描述、自我评价和manager_comment放在一个文件中。
我应该使用什么脚本来做到这一点?
- 每次生成文档时,我还希望为每个文档生成一个 link 并将其放入电子表格的选项卡中。借助google脚本,我希望能在这个选项卡中自动打印每个员工的文档link。我举了一些我期望的例子 here。请建议我可以使用什么脚本来实现这一点。
感谢您回答问题。非常感谢!
在这种情况下,为了达到你的目的,我修改了the sample script of your previous question如下。修改点如下
- 为了使用现有的脚本,我为您的新情况转换了
res
的值。
- 我添加了每个段落的段落名称。
- 为了包含您的第二个请求,“Employee_ID”、“Worker”的值和创建的文档的 URL 从循环中返回,这些值被放入“Link" sheet.
将这些反映到示例脚本中,就变成了下面这样。
示例脚本:
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 Spreadsheet 和 Google 文档。当这些改变时,这个脚本可能无法使用。请注意这一点。
很遗憾,我在您的示例输出文档中找不到“Employee_Comment:”。在这种情况下,是“Self_Evaluation”吗?这可以从示例 Spreadsheet 的 header 行中找到。我建议的脚本使用这个值。
参考文献:
这是我发布的
- 领导给我分配了一项任务,将 table 从电子表格转换为 google 文档中的段落。
基本上,我被分配到转这组data, into the expected output。
虽然Employee_ID和工人信息只包含1条信息, 目标、描述、自我评价和Manager_Comment 可能有多行,每个人可能有不同的数字(即有些人可能只有 1 个目标,有些人可能有 2、3 甚至更多)。然而,我的任务是为每个人创建一个文件,因此我必须将每个人的所有目标、描述、自我评价和manager_comment放在一个文件中。
我应该使用什么脚本来做到这一点?
- 每次生成文档时,我还希望为每个文档生成一个 link 并将其放入电子表格的选项卡中。借助google脚本,我希望能在这个选项卡中自动打印每个员工的文档link。我举了一些我期望的例子 here。请建议我可以使用什么脚本来实现这一点。
感谢您回答问题。非常感谢!
在这种情况下,为了达到你的目的,我修改了the sample script of your previous question如下。修改点如下
- 为了使用现有的脚本,我为您的新情况转换了
res
的值。 - 我添加了每个段落的段落名称。
- 为了包含您的第二个请求,“Employee_ID”、“Worker”的值和创建的文档的 URL 从循环中返回,这些值被放入“Link" sheet.
将这些反映到示例脚本中,就变成了下面这样。
示例脚本:
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 Spreadsheet 和 Google 文档。当这些改变时,这个脚本可能无法使用。请注意这一点。
很遗憾,我在您的示例输出文档中找不到“Employee_Comment:”。在这种情况下,是“Self_Evaluation”吗?这可以从示例 Spreadsheet 的 header 行中找到。我建议的脚本使用这个值。