Google 工作表 - 自动创建新作品sheet 显示一行父 sheet
Google Sheets - Automate Creation of New Worksheets that show one row of parent sheet
我有一个 Google 表单,可以将数据保存到 Google Sheet 中。表格由学生在线填写 class.
教师会定期将其他数据添加到 Google Sheet 的每一行,以跟踪他们的出勤情况。我希望能够与每个学生共享数据的只读镜像,以便他们只能看到自己的数据。 (来自给定学生的所有数据都在作业的一行中sheet)。
我知道可以通过为每个学生创建一个新的 sheet,使用 =IMPORTRANGE() 将他们的数据行镜像到 sheet,并共享一个 [=24] 来手动完成此操作=] 与学生一起 sheet。但是,考虑到需要手动创建的 sheet 的数量,这是不可行的。
有没有办法自动与人共享有限的数据部分?
此脚本将每行创建一个电子表格,并将其第一行等同于原始电子表格 (header) 的第一行,并在其第二行使用 IMPORTRANGE
。然后它将该行中的电子邮件作为查看器添加到新创建的电子表格中。
脚本:
function exportData() {
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var sheet = spreadsheet.getActiveSheet();
var range = sheet.getDataRange();
var values = range.getValues();
var header = values.shift();
var ssId = spreadsheet.getId();
values.forEach((row, index) => {
var newName = `Data: ${row[2]}, ${row[1]}`;
var files = DriveApp.getFilesByName(newName);
// file is already existing
if (files.hasNext())
return;
var newSpreadsheet = SpreadsheetApp.create(newName);
var newSheet = newSpreadsheet.getActiveSheet();
var rowNum = index + 2;
var newSsId = newSpreadsheet.getId();
// append header to new file's first row
newSheet.appendRow(header)
// use importrange on A2
newSheet.getRange(2, 1).setFormula(`=IMPORTRANGE("${spreadsheet.getUrl()}", "${sheet.getSheetName()}!A${rowNum}:${rowNum}")`);
// add permission to automatically allow access to importrange
addImportrangePermission(ssId, newSpreadsheet.getId());
// add the email in the third column as the viewer
DriveApp.getFileById(newSsId).addViewer(row[5]);
});
}
function addImportrangePermission(donorId, ssId) {
// adding permission by fetching this url
const url = `https://docs.google.com/spreadsheets/d/${ssId}/externaldata/addimportrangepermissions?donorDocId=${donorId}`;
const token = ScriptApp.getOAuthToken();
const params = {
method: 'post',
headers: {
Authorization: 'Bearer ' + token,
},
muteHttpExceptions: true
};
UrlFetchApp.fetch(url, params);
}
原始电子表格:
示例输出:
新电子表格内容示例:
注:
- 脚本已根据您的示例数据更新
如果电子邮件无效,addViewer
将失败,因此请务必使用一个。请务必调整传递给 row
的列以避免失败。
我有一个 Google 表单,可以将数据保存到 Google Sheet 中。表格由学生在线填写 class.
教师会定期将其他数据添加到 Google Sheet 的每一行,以跟踪他们的出勤情况。我希望能够与每个学生共享数据的只读镜像,以便他们只能看到自己的数据。 (来自给定学生的所有数据都在作业的一行中sheet)。
我知道可以通过为每个学生创建一个新的 sheet,使用 =IMPORTRANGE() 将他们的数据行镜像到 sheet,并共享一个 [=24] 来手动完成此操作=] 与学生一起 sheet。但是,考虑到需要手动创建的 sheet 的数量,这是不可行的。
有没有办法自动与人共享有限的数据部分?
此脚本将每行创建一个电子表格,并将其第一行等同于原始电子表格 (header) 的第一行,并在其第二行使用 IMPORTRANGE
。然后它将该行中的电子邮件作为查看器添加到新创建的电子表格中。
脚本:
function exportData() {
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var sheet = spreadsheet.getActiveSheet();
var range = sheet.getDataRange();
var values = range.getValues();
var header = values.shift();
var ssId = spreadsheet.getId();
values.forEach((row, index) => {
var newName = `Data: ${row[2]}, ${row[1]}`;
var files = DriveApp.getFilesByName(newName);
// file is already existing
if (files.hasNext())
return;
var newSpreadsheet = SpreadsheetApp.create(newName);
var newSheet = newSpreadsheet.getActiveSheet();
var rowNum = index + 2;
var newSsId = newSpreadsheet.getId();
// append header to new file's first row
newSheet.appendRow(header)
// use importrange on A2
newSheet.getRange(2, 1).setFormula(`=IMPORTRANGE("${spreadsheet.getUrl()}", "${sheet.getSheetName()}!A${rowNum}:${rowNum}")`);
// add permission to automatically allow access to importrange
addImportrangePermission(ssId, newSpreadsheet.getId());
// add the email in the third column as the viewer
DriveApp.getFileById(newSsId).addViewer(row[5]);
});
}
function addImportrangePermission(donorId, ssId) {
// adding permission by fetching this url
const url = `https://docs.google.com/spreadsheets/d/${ssId}/externaldata/addimportrangepermissions?donorDocId=${donorId}`;
const token = ScriptApp.getOAuthToken();
const params = {
method: 'post',
headers: {
Authorization: 'Bearer ' + token,
},
muteHttpExceptions: true
};
UrlFetchApp.fetch(url, params);
}
原始电子表格:
示例输出:
新电子表格内容示例:
注:
- 脚本已根据您的示例数据更新 如果电子邮件无效,
addViewer
将失败,因此请务必使用一个。请务必调整传递给row
的列以避免失败。