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 的列以避免失败。