如何使用 Google 脚本获取特定 sheet 的 link?

How could I get the link of an specific sheet with Google script?

我有很多 sheet 的传播sheet。每个 sheet 都是一份报告,并且有不同的 link。我怎样才能得到这个活动 sheet 的 link?

例:输出 > 报告的link可用here.

您的 'here' link 不起作用,但是,可以为特定的 sheet.

当您打开 Google Sheet 并在浏览器中导航 sheet 时,您会注意到 URL 有一个锚元素,即#gid=some_number .

将相同的 #gid=some_number 部分附加到任何 hyperlink 上,你的传播 sheet 将 link 直接到那个 sheet。

如果您使用脚本以编程方式生成 sheets,所以事先不知道 gid,那么您将需要在 [=22= 中使用 getSheetID 函数] 剧本

祝你好运!

var thisDocumentUrl = SpreadsheetApp.getActiveSpreadsheet().getUrl();

A link 到您希望指定的任何文件夹中的所有传播sheet sheet。

如果它是您的根,可能需要一段时间

function getFnFX(folder = DriveApp.getRootFolder()) {
  var tree = JSON.parse(PropertiesService.getScriptProperties().getProperty('FnF'));
  //Logger.log(JSON.stringify(tree));
  if (tree.level < level) {
    tree.level = level;
    PropertiesService.getScriptProperties().setProperty('FnF', JSON.stringify(tree));
  }
  const files = folder.getFilesByType(MimeType.GOOGLE_SHEETS);
  let row = Array.from([...Array(level).keys()], ((x, i) => { if (i == level - 1) { x = folder.getName(); } else { x = ''; } return x; }));
  tree.txt.push(row);
  row = Array.from([...Array(level).keys()], ((x, i) => { if (i == level - 1) { x = 'bold'; } else { x = 'normal'; } return x; }));
  tree.fwt.push(row);
  PropertiesService.getScriptProperties().setProperty('FnF', JSON.stringify(tree));
  if (files.hasNext()) {
    let row = Array.from([...Array(level).keys()], ((x, i) => { if (i == level - 1) { x = 'Files:'; } else { x = ''; } return x; }));
    tree.txt.push(row);
    tree.fwt.push(['normal']);
    PropertiesService.getScriptProperties().setProperty('FnF', JSON.stringify(tree));
  }
  while (files.hasNext()) {
    let file = files.next();
    let row = Array.from([...Array(level + 1).keys()], ((x, i) => { if (i == level) { x = file.getName(); } else { x = ''; } return x; }));
    tree.txt.push(row);
    //The next section of the code is hard wired for an array of 4 columns because I knew it  would work with a folder that has two levels of subfolders so it won't work for my whole drive.  I did that just for simplicity for this example.
    SpreadsheetApp.openById(file.getId()).getSheets().forEach(s =>
      tree.txt.push(["", "", "", `=HYPERLINK("https://docs.google.com/spreadsheets/d/${file.getId()}/edit#gid=${s.getSheetId()}","${s.getName()}")`]));
    tree.fwt.push(['normal']);
    PropertiesService.getScriptProperties().setProperty('FnF', JSON.stringify(tree));
  }
  const subfolders = folder.getFolders()
  while (subfolders.hasNext()) {
    let subfolder = subfolders.next();
    level++;
    getFnFX(subfolder);
  }
  level--;
}

function getFilesAndFoldersX() {
  const fldr = null;
  const ss = SpreadsheetApp.getActive();
  ss.toast("Entry");
  const sh = ss.getSheetByName('Sheet1');
  sh.clearContents();
  SpreadsheetApp.flush();
  PropertiesService.getScriptProperties().setProperty('FnF', JSON.stringify({ txt: [], fwt: [], level: 0 }));
  getFnFX();//if you have no parameters here it will start with the root and recursive access every folder in your drive.  If the provide it with DriveApp.getFolderById() then it will limit itself to that folder
  //Logger.log(PropertiesService.getScriptProperties().getProperty('FnF'));
  let tree = JSON.parse(PropertiesService.getScriptProperties().getProperty('FnF'));
  const l = tree.level + 1
  tree.txt.forEach(r => {
    if (r.length < l) {
      //Array.from(Array(l - r.length).keys()).forEach(e => r.push(''));
      r.splice(r.length, 0, ...Array(l - r.length).fill(''));
    }
  });
  tree.fwt.forEach(r => {
    if (r.length < l) {
      //Array.from(Array(l - r.length).keys()).forEach(e => r.push('normal'));
      r.splice(r.length, 0, ...Array(l - r.length).fill('normal'));
    }
  });
  Logger.log(JSON.stringify(tree));
  sh.getRange(1, 1, tree.txt.length, tree.level + 1).setValues(tree.txt);
  sh.getRange(1, 1, tree.fwt.length, tree.level + 1).setFontWeights(tree.fwt);
  PropertiesService.getScriptProperties().deleteProperty('FnF');
  ss.toast("EOF");
}

我只释放了一个文件夹,它只有几层文件夹,结果如下:

Root Level1 Level2 Links
TestFolder
Files:
TestDest
Sheet1
Sheet0
TestSource
Sheet1
Options
Sheet2
Sheet4
Sheet3
Testing doPost and doGet
Sheet1
LIZ
JJE-DataGenerators
Sheet1
Sheet2
Folder3
Folder2
Folder4
Folder1

第四列是您选择文件夹中每个传播sheet 的每个 sheet 的超links。如果你在整个驱动器上释放它,你可能需要调整行大小,因为我很久以前出于特定原因编写了这个脚本,其中不包括在我的整个驱动器上释放它,因为我知道这将需要大约 20 分钟。

基本递归将遍历您想要的任何根文件夹中的所有文件夹,我已将其设置为查找 spreadsheets。