如何使用 google 脚本自动将表单响应从 google sheet 移动到 google 文档?
How can I automate moving form responses from a google sheet to a google doc using google scripts?
我有应用程序进入 google 电子表格。本质上,我试图将每个应用程序(行)通过邮件合并到一个长 google 文档中的页面,我可以在其中阅读应用程序。所以我正在尝试编写一个 google 脚本,该脚本 1. 从表单的响应电子表格中提取每一行,2. 复制模板文档,3. 将模板粘贴到新制作的文档中,以及 4. 替换文本带有表单响应的模板。
我不想为每个应用程序制作一个单独的文档,而是希望在替换上一行的文本后添加一个分页符,然后再次复制模板。这样一来,代码就循环遍历电子表格中的所有行,我只需打开一个文档来阅读应用程序。
这是我一直在使用的代码。我已经使用了大量教程来达到这一点,但我无法弄清楚如何正确循环 rows/paragraphs 。我的代码的最后一次迭代导致第一页上的所有名称,然后是 Id,然后是电子邮件。而不是一个人的所有信息都在第一页。所以我做了更多更改,现在新制作的 google 文档中没有显示任何内容。
嵌套函数 updateDoc() 是我遇到的问题。其他一切似乎都正常工作。 foreach 和 for 循环让我失望。数组中的数组不是我在这个项目之前使用过的东西。 (请参阅 updateDoc() 函数中的第 4 行和第 5 行)
function AutoFill() {
// Global variables
var templateFile = DocumentApp.openById('theID');
var newDoc = DocumentApp.create('CopyOf'+ templateFile.getName());
var copyTemplate = templateFile.getBody().getParagraphs();
newDoc.getBody().clear();
var sourceFileId = newDoc.getId();
var targetFolderId = 'thisID';
// Pull the data from spreadsheet
var sheet = SpreadsheetApp.getActiveSheet();
var data = sheet.getDataRange().getValues();
Logger.log('data pulled');
data.forEach(function(r){
updateDoc(data, copyTemplate, newDoc);
});
moveFiles(sourceFileId, targetFolderId);
Logger.log('File Moved');
// move newDoc to 'Populated Applications' Folder
function moveFiles(sourceFileId, targetFolderId) {
var file = DriveApp.getFileById(sourceFileId);
var folder = DriveApp.getFolderById(targetFolderId);
file.moveTo(folder);
}
// Update the doc w/ data from spreadsheet
function updateDoc(data, copyTemplate, newDoc) {
var rows = data.length;
var cols = data[0].length;
var rowNumber = 1;
copyTemplate.forEach(function(p){
for (var a=1; a < rows; a++){
newDoc.getBody().appendParagraph(
p
.copy()
.replaceText('{{name}}', data[a][2])
.replaceText('{{ccaId}}', data[a][3])
.replaceText('{{email}}', data[a][1])
.replaceText('{{academicProgram}}', data[a][4])
.replaceText('{{year}}', data[a][5])
.replaceText('{{positions}}', data[a][6])
.replaceText('{{Response1}}', data[a][7])
.replaceText('{{Response2}}', data[a][8])
.replaceText('{{Response3}}', data[a][9])
.replaceText('{{Response4}}', data[a][10]));
Logger.log(a + 'page completed');
};
newDoc.getBody().appendPageBreak();
});
}
}
您的代码将每一行数据的所有数据行发送到您的 updateDoc()
函数,然后该函数处理模板中每个段落的所有数据行 - 这就是为什么您得到您作为结果。
替换
data.forEach(function(r){
updateDoc(data, copyTemplate, newDoc);
});
只有
updateDoc(data, copyTemplate, newDoc);
并改变
copyTemplate.forEach(function(p){
for (var a=1; a < rows; a++){
newDoc.getBody().appendParagraph(
p
.copy()
.replaceText('{{name}}', data[a][2])
.replaceText('{{ccaId}}', data[a][3])
.replaceText('{{email}}', data[a][1])
.replaceText('{{academicProgram}}', data[a][4])
.replaceText('{{year}}', data[a][5])
.replaceText('{{positions}}', data[a][6])
.replaceText('{{Response1}}', data[a][7])
.replaceText('{{Response2}}', data[a][8])
.replaceText('{{Response3}}', data[a][9])
.replaceText('{{Response4}}', data[a][10]));
Logger.log(a + 'page completed');
};
newDoc.getBody().appendPageBreak();
});
至
for (var a=1; a < rows; a++){
copyTemplate.forEach(function(p){
newDoc.getBody().appendParagraph(
p
.copy()
.replaceText('{{name}}', data[a][2])
.replaceText('{{ccaId}}', data[a][3])
.replaceText('{{email}}', data[a][1])
.replaceText('{{academicProgram}}', data[a][4])
.replaceText('{{year}}', data[a][5])
.replaceText('{{positions}}', data[a][6])
.replaceText('{{Response1}}', data[a][7])
.replaceText('{{Response2}}', data[a][8])
.replaceText('{{Response3}}', data[a][9])
.replaceText('{{Response4}}', data[a][10])
);
Logger.log(a + ' page completed');
}
newDoc.getBody().appendPageBreak();
}
感谢@azawaza 修复了我遇到的 for 循环/forEach 问题。这是工作代码。我希望它对以后的其他人有所帮助。
function AutoFill() {
// Global variables
var templateFile = DocumentApp.openById('yourTemplateID');
var newDoc = DocumentApp.create('CopyOf'+ templateFile.getName());
var copyTemplate = templateFile.getBody().getParagraphs();
newDoc.getBody().clear();
var sourceFileId = newDoc.getId();
var targetFolderId = 'yourFolderId';
// Pull the data from spreadsheet
var sheet = SpreadsheetApp.getActiveSheet();
var data = sheet.getDataRange().getValues();
Logger.log('data pulled');
updateDoc(data, copyTemplate, newDoc);
moveFiles(sourceFileId, targetFolderId);
Logger.log('File Moved');
// move newDoc to 'Populated Applications' Folder
function moveFiles(sourceFileId, targetFolderId) {
var file = DriveApp.getFileById(sourceFileId);
var folder = DriveApp.getFolderById(targetFolderId);
file.moveTo(folder);
}
// Update the doc w/ data from spreadsheet
function updateDoc(data, copyTemplate, newDoc) {
var rows = data.length;
var cols = data[0].length;
var rowNumber = 1;
for (var a=1; a < rows; a++){
copyTemplate.forEach(function(p){
newDoc.getBody().appendParagraph(
p
.copy()
.replaceText('{{name}}', data[a][2])
.replaceText('{{ccaId}}', data[a][3])
.replaceText('{{email}}', data[a][1])
.replaceText('{{academicProgram}}', data[a][4])
.replaceText('{{year}}', data[a][5])
.replaceText('{{positions}}', data[a][6])
.replaceText('{{Response1}}', data[a][7])
.replaceText('{{Response2}}', data[a][8])
.replaceText('{{Response3}}', data[a][9])
.replaceText('{{Response4}}', data[a][10])
);
});
Logger.log(a + 'page completed');
newDoc.getBody().appendPageBreak();
}
}
}
我有应用程序进入 google 电子表格。本质上,我试图将每个应用程序(行)通过邮件合并到一个长 google 文档中的页面,我可以在其中阅读应用程序。所以我正在尝试编写一个 google 脚本,该脚本 1. 从表单的响应电子表格中提取每一行,2. 复制模板文档,3. 将模板粘贴到新制作的文档中,以及 4. 替换文本带有表单响应的模板。
我不想为每个应用程序制作一个单独的文档,而是希望在替换上一行的文本后添加一个分页符,然后再次复制模板。这样一来,代码就循环遍历电子表格中的所有行,我只需打开一个文档来阅读应用程序。
这是我一直在使用的代码。我已经使用了大量教程来达到这一点,但我无法弄清楚如何正确循环 rows/paragraphs 。我的代码的最后一次迭代导致第一页上的所有名称,然后是 Id,然后是电子邮件。而不是一个人的所有信息都在第一页。所以我做了更多更改,现在新制作的 google 文档中没有显示任何内容。
嵌套函数 updateDoc() 是我遇到的问题。其他一切似乎都正常工作。 foreach 和 for 循环让我失望。数组中的数组不是我在这个项目之前使用过的东西。 (请参阅 updateDoc() 函数中的第 4 行和第 5 行)
function AutoFill() {
// Global variables
var templateFile = DocumentApp.openById('theID');
var newDoc = DocumentApp.create('CopyOf'+ templateFile.getName());
var copyTemplate = templateFile.getBody().getParagraphs();
newDoc.getBody().clear();
var sourceFileId = newDoc.getId();
var targetFolderId = 'thisID';
// Pull the data from spreadsheet
var sheet = SpreadsheetApp.getActiveSheet();
var data = sheet.getDataRange().getValues();
Logger.log('data pulled');
data.forEach(function(r){
updateDoc(data, copyTemplate, newDoc);
});
moveFiles(sourceFileId, targetFolderId);
Logger.log('File Moved');
// move newDoc to 'Populated Applications' Folder
function moveFiles(sourceFileId, targetFolderId) {
var file = DriveApp.getFileById(sourceFileId);
var folder = DriveApp.getFolderById(targetFolderId);
file.moveTo(folder);
}
// Update the doc w/ data from spreadsheet
function updateDoc(data, copyTemplate, newDoc) {
var rows = data.length;
var cols = data[0].length;
var rowNumber = 1;
copyTemplate.forEach(function(p){
for (var a=1; a < rows; a++){
newDoc.getBody().appendParagraph(
p
.copy()
.replaceText('{{name}}', data[a][2])
.replaceText('{{ccaId}}', data[a][3])
.replaceText('{{email}}', data[a][1])
.replaceText('{{academicProgram}}', data[a][4])
.replaceText('{{year}}', data[a][5])
.replaceText('{{positions}}', data[a][6])
.replaceText('{{Response1}}', data[a][7])
.replaceText('{{Response2}}', data[a][8])
.replaceText('{{Response3}}', data[a][9])
.replaceText('{{Response4}}', data[a][10]));
Logger.log(a + 'page completed');
};
newDoc.getBody().appendPageBreak();
});
}
}
您的代码将每一行数据的所有数据行发送到您的 updateDoc()
函数,然后该函数处理模板中每个段落的所有数据行 - 这就是为什么您得到您作为结果。
替换
data.forEach(function(r){
updateDoc(data, copyTemplate, newDoc);
});
只有
updateDoc(data, copyTemplate, newDoc);
并改变
copyTemplate.forEach(function(p){
for (var a=1; a < rows; a++){
newDoc.getBody().appendParagraph(
p
.copy()
.replaceText('{{name}}', data[a][2])
.replaceText('{{ccaId}}', data[a][3])
.replaceText('{{email}}', data[a][1])
.replaceText('{{academicProgram}}', data[a][4])
.replaceText('{{year}}', data[a][5])
.replaceText('{{positions}}', data[a][6])
.replaceText('{{Response1}}', data[a][7])
.replaceText('{{Response2}}', data[a][8])
.replaceText('{{Response3}}', data[a][9])
.replaceText('{{Response4}}', data[a][10]));
Logger.log(a + 'page completed');
};
newDoc.getBody().appendPageBreak();
});
至
for (var a=1; a < rows; a++){
copyTemplate.forEach(function(p){
newDoc.getBody().appendParagraph(
p
.copy()
.replaceText('{{name}}', data[a][2])
.replaceText('{{ccaId}}', data[a][3])
.replaceText('{{email}}', data[a][1])
.replaceText('{{academicProgram}}', data[a][4])
.replaceText('{{year}}', data[a][5])
.replaceText('{{positions}}', data[a][6])
.replaceText('{{Response1}}', data[a][7])
.replaceText('{{Response2}}', data[a][8])
.replaceText('{{Response3}}', data[a][9])
.replaceText('{{Response4}}', data[a][10])
);
Logger.log(a + ' page completed');
}
newDoc.getBody().appendPageBreak();
}
感谢@azawaza 修复了我遇到的 for 循环/forEach 问题。这是工作代码。我希望它对以后的其他人有所帮助。
function AutoFill() {
// Global variables
var templateFile = DocumentApp.openById('yourTemplateID');
var newDoc = DocumentApp.create('CopyOf'+ templateFile.getName());
var copyTemplate = templateFile.getBody().getParagraphs();
newDoc.getBody().clear();
var sourceFileId = newDoc.getId();
var targetFolderId = 'yourFolderId';
// Pull the data from spreadsheet
var sheet = SpreadsheetApp.getActiveSheet();
var data = sheet.getDataRange().getValues();
Logger.log('data pulled');
updateDoc(data, copyTemplate, newDoc);
moveFiles(sourceFileId, targetFolderId);
Logger.log('File Moved');
// move newDoc to 'Populated Applications' Folder
function moveFiles(sourceFileId, targetFolderId) {
var file = DriveApp.getFileById(sourceFileId);
var folder = DriveApp.getFolderById(targetFolderId);
file.moveTo(folder);
}
// Update the doc w/ data from spreadsheet
function updateDoc(data, copyTemplate, newDoc) {
var rows = data.length;
var cols = data[0].length;
var rowNumber = 1;
for (var a=1; a < rows; a++){
copyTemplate.forEach(function(p){
newDoc.getBody().appendParagraph(
p
.copy()
.replaceText('{{name}}', data[a][2])
.replaceText('{{ccaId}}', data[a][3])
.replaceText('{{email}}', data[a][1])
.replaceText('{{academicProgram}}', data[a][4])
.replaceText('{{year}}', data[a][5])
.replaceText('{{positions}}', data[a][6])
.replaceText('{{Response1}}', data[a][7])
.replaceText('{{Response2}}', data[a][8])
.replaceText('{{Response3}}', data[a][9])
.replaceText('{{Response4}}', data[a][10])
);
});
Logger.log(a + 'page completed');
newDoc.getBody().appendPageBreak();
}
}
}