我有一个Google表单,可以将数据保存到Google表中。该表格由在线班的学生填写。
他们的老师定期将额外的数据添加到谷歌单子的每一行,以跟踪他们的出勤率。我希望能够与每个学生共享数据的只读镜像,这样他们只能看到自己的数据。(来自给定学生的所有数据都在工作表的一行中)。
我知道这可以通过为每个学生创建一个新的工作表来手动完成,使用=IMPORTRANGE()将他们的数据行镜像到工作表中,并与学生共享到工作表的链接。但是,考虑到需要手动创建的工作表数量,这是不可行的。
是否有一种方法可以自动与人共享有限的部分数据?
发布于 2022-05-03 02:18:52
此脚本将创建每行电子表格,并将其第一行等同于原始电子表格(标头)的第一行,并在其第二行使用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);
}
原始电子表格:
样本输出:
新电子表格内容示例:
注意:
如果电子邮件无效,则基于示例data
addViewer
更新row
的列以避免失败。https://stackoverflow.com/questions/72093967
复制相似问题