Gunakan IMPORTRANGE untuk mengalih keluar kebenaran satu hamparan untuk mengekstrak data daripada hamparan lain
P粉511985082
P粉511985082 2024-03-30 23:27:35
0
1
553

dengan IMPORTRANGE SpreadSheet A, B, C, dll. Meminta akses untuk mengekstrak data daripada SpreadSheet 1 (Rajah 1). Contoh:

=IMPORTRANGE("SpreadSheet 1"; "Sheet!A1")

Saya mahu mengalih keluar akses (membatalkan kebenaran) daripada Spreadsheet A untuk mengekstrak data daripada Spreadsheet 1 (Gambar 2) Membatalkan akses yang dibenarkan kepada Gambar 1 untuk membatalkan kebenaran yang diberikan kepada Spreadsheet AElectronic dari Jadual Percetakan ekstrak data

Ini hanyalah contoh ringkas kerana sebenarnya saya mempunyai lebih 200 hamparan yang disambungkan kepada 1 (sebenarnya 2) hamparan pangkalan data, sebab itu saya ingin membatalkan kebenaran, berapa banyak hamparan boleh mengakses satu hamparan Saya telah mencapai had ini berkali-kali dengan borang saya

Gambar hamparan sebenar untuk membantu memahami bahagian kod saya, skrip akan dijalankan pada hamparan yang sama meminta akses

Saya mungkin silap tetapi saya mempunyai skrip lama yang saya fikir berkesan pada satu masa

function removePermission() 
{
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const ss_c = ss.getSheetByName('Config');

  var currentSheetId = ss.getId();
  var targetId = "";

  if (ss_c.getRange("B6").getValue() == 1)
  {
    targetId = ss_c.getRange("D6").getValue();
  } 
  else if (ss_c.getRange("B6").getValue() == 2) 
  {
    targetId = ss_c.getRange("D7").getValue();
  }

  var currentFile = DriveApp.getFileById(currentSheetId);
  var targetFile = DriveApp.getFileById(targetId);
  var targetPermissions = targetFile.getPermissions();

  for (var i = 0; i < targetPermissions.length; i++) 
  {
    var permission = targetPermissions[i];
    if (permission.getType() == "user" && permission.hasAccess()) 
    {
      currentFile.removeEditor(permission.getEmail()); // or the next one
//    targetFile.removeEditor(permission.getEmail());
    }
  }
}

Tetapi kini ia menunjukkan ralatTypeError: targetFile.getPermissions is not a function

Jadi saya cuba mengubah suainya dengan apa yang saya cari

function test() 
{
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const ss_c = ss.getSheetByName('Config');

  var currentSheetId = ss.getId();
  var targetId = "";

  if (ss_c.getRange("B6").getValue() == 1) 
  {
    targetId = ss_c.getRange("D6").getValue();
  } 
  else if (ss_c.getRange("B6").getValue() == 2) 
  {
    targetId = ss_c.getRange("D7").getValue();
  }

  var currentFile = DriveApp.getFileById(currentSheetId);
  var targetFile = DriveApp.getFileById(targetId);
  var targetEditors = targetFile.getEditors();
  var currentEditors = currentFile.getEditors();
  var activeUserEmail = Session.getActiveUser().getEmail();

  for (var i = 0; i < targetEditors.length; i++) {
    var editor = targetEditors[i];
    var editorEmail = editor.getEmail();
    
    // Check if the editor exists in the current file before removing
    if (editorEmail !== activeUserEmail && currentEditors.some(e => e.getEmail() === editorEmail)) {
      targetFile.removeEditor(editorEmail);
    }
  }
}

Lulus tetapi tidak bekerja

Saya tidak biasa dengan tepat cara editor berfungsi dalam kes ini, dan mencari saya tidak dapat mencari soalan dan penyelesaian yang berkaitan

Saya pemilik dan hanya pengguna, tidak pasti tetapi ia berkaitan dengan fail bukan pengguna, hargai bantuan, terima kasih

P粉511985082
P粉511985082

membalas semua(1)
P粉976737101

Saya percaya matlamat anda adalah seperti berikut.

  • Anda mempunyai Hamparan Google yang mengandungi fungsi IMPORTRANGE yang dibenarkan.
  • Anda mahu membatalkan berbilang keizinan untuk IMPORTRANGE dalam hamparan anda.

Masalah dan Penyelesaian:

Lihat kaedah untuk membatalkan terus IMPORTRANGEkeizinan Hamparan. Malangnya, saya tidak dapat mencari kaedahnya. Walau bagaimanapun, kita sudah tahu bahawa apabila menggunakan titik akhir, proses kebenaran boleh dijalankan oleh skrip. Rujuk Saya rasa ini mungkin berfungsi sebagai penyelesaian dalam kes anda. Aliran untuk penyelesaian ini adalah seperti berikut.

  1. Salin hamparan asal.
  2. Keizinan IMPORTRANGE, kecuali hamparan yang ingin anda batalkan.

Ikuti proses ini untuk mendapatkan Hamparan Google dengan membatalkan hamparan khusus yang anda inginkan.

Walau bagaimanapun, dalam penyelesaian ini, ID hamparan berbeza daripada ID asal kerana hamparan asal telah disalin. Jadi, saya tidak pasti sama ada ini berguna dalam situasi sebenar anda. Jadi, saya hanya mencadangkan penyelesaian ini.

Apabila proses di atas ditunjukkan dalam skrip sampel, ia menjadi seperti berikut.

Contoh skrip:

Sila salin dan tampal skrip berikut ke dalam editor skrip hamparan asal dan tetapkan spreadsheetIdsOfdeletePermission dan simpan skrip.

function myFunction() {
  // Please set the Spreadsheet IDs you want to revoke the authorization of "IMPORTRANGE".
  const spreadsheetIdsOfdeletePermission = ["###spreadsheetId1###", "###spreadsheetId2###",,,];

  // Retrieve original Spreadsheet.
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const ssId = ss.getId();
  const orgFile = DriveApp.getFileById(ssId);
  const parent = orgFile.getParents().next();

  // Copy original Spreadsheet.
  const tempFile = orgFile.makeCopy(ss.getName() + "_new", parent);
  const tempFileId = tempFile.getId();

  // Authorize "IMPORTRANGE" except for "spreadsheetIdsOfdeletePermission"
  const tempSS = SpreadsheetApp.open(tempFile);
  const token = ScriptApp.getOAuthToken();
  const reqs = tempSS.createTextFinder("=IMPORTRANGE").matchFormulaText(true).findAll().reduce((ar, r) => {
    const id = r.getFormula().match(/^\=IMPORTRANGE\("(.*?)"/)[1].split("/")[5];
    if (!spreadsheetIdsOfdeletePermission.includes(id)) {
      const url = `https://docs.google.com/spreadsheets/d/${tempFileId}/externaldata/addimportrangepermissions?donorDocId=${id}`;
      ar.push({ url, method: "post", headers: { Authorization: `Bearer ${token}` }, muteHttpExceptions: true });
    }
    return ar;
  }, []);
  if (reqs.length == 0) return;
  const res = UrlFetchApp.fetchAll(reqs);
  res.forEach(r => {
    if (r.getResponseCode() != 200) {
      console.log(r.getContentText());
    }
  });
}
  • Apabila anda menjalankan skrip ini, hamparan asal akan disalin dan hamparan baharu dibuat dengan membatalkan kebenaran khusus untuk "IMPORTRANGE".

Nota:

  • Malangnya, saya tidak dapat memahami situasi sebenar anda. Oleh itu, jika ralat berlaku berkaitan permintaan berturut-turut, anda mungkin perlu menambah Utilities.sleep 的循环中使用 UrlFetchApp.fetch 而不是 UrlFetchApp.fetchAll dengan
  • .

Rujukan:
  • Bagaimana untuk membenarkan akses kepada fungsi importrange melalui skrip aplikasi?
  • fetchAll(permintaan)
🎜
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan