如何从单元格电子表格中提取 url 到字符串并使用 DocumentApp.openByUrl

How to extract the url from a cell Spreadsheet to string and use DocumentApp.openByUrl

在电子表格单元格中,我有一个 link 到 Google 文档,我想恢复它以便打开 Google 文档并修改它。所以在我的单元格中,我把这种格式 https://docs.google.com/document/d/1Gb48I......(最后没有 /edit)我试过了

            var body = '=HYPERLINK("'data[n][COLUMN_URL-1]'+'/edit'")'.getBody();
            var body = '=HYPERLINK("'data[n][COLUMN_URL-1]'+'/edit'")'.getBody();

           // this one works but I want to use data[n][COLUMN_URL-1] because I have several Google Docs links
var body = DocumentApp.openByUrl('https://docs.google.com/document/d/1Gb48IXos......../edit').getBody(); 
            if(body){
//edit the Google doc

如果您有想法,谢谢您,因为通过串联 /edit(第 3 行代码)它可以工作

编辑:单元格未格式化(hyperlinked)/公式我只有 https://...

编辑 2:我试过使用来自 Suhail Ansari 的代码,谢谢,但我有一个错误,文件丢失,如果你有其他想法,我没有任何日志:

var COLUMN_URL = 10 ;

function getIdFrom(url) {
  var id = "";
  var parts = url.split(/^(([^:\/?#]+):)?(\/\/([^\/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?/);
  if (url.indexOf('?id=') >= 0){
    id = (parts[6].split("=")[1]).replace("&usp","");
    return id;
  } else {
    id = parts[5].split("/");
    //Using sort to get the id as it is the longest element. 
    var sortArr = id.sort(function(a,b){return b.length - a.length});
    id = sortArr[0];
    return id;
  }
}

var sheet = SpreadsheetApp.openById(SPREADSHEET_ID).getSheetByName(SHEET_NAME);
  var numRows = sheet.getLastRow();
  var lastColumn = sheet.getLastColumn();
  var data = sheet.getRange(1,1,numRows,lastColumn).getDisplayValues();
   for(n=1;n < data.length;n++) {
  var URL =data[n][COLUMN_URL-1];
        Logger.log('The URL  ',URL);
        var id = getIdFrom(URL);
        Logger.log('The ID  ',id);
        var body = DocumentApp.openById(id).getBody();
        
        
        if(body)
        {......//edit Google Doc

这是 Google 文档

中带有 URL 的第 10 列

事实上我有docs.google.com/open?id=1qo0B_HCbjcBrYyJ ...作为URL对于其他行我试图为第3行做手工如图所示

编辑 3:所以此刻我很困惑,因为我在电子表格中的列来自一个循环,在这个循环中我将 Google 文档的 URL 放在这样的单元格中: var trange = sheet.getRange.. trange.setValue(doc.getUrl()); 现在如果我查看 table 我有 link 这种格式的

https://docs.google.com/open?id=1RYRVotAq6IOz5tys1krnENfgN_pU0KYuUzR24i so now if i want to get back the Google Doc I have the following :

 //  var body = DocumentApp.openByUrl('https://docs.google.com/open?id=1Xb4QjiWwpn2TJ8-9kkIhU6m1rgmb48g6xYVopN').getBody();
            //var body = DocumentApp.openByUrl('https://docs.google.com/1Xb4QjiWwpn2TJ8-9kkIhU6m1rgmb48g6xYVopN/edit').getBody();
            var body = DocumentApp.openByUrl('https://docs.google.com/document/d/1Xb4QjiWwpn2TJ8-9kkIhU6m1rgmb48g6xYVopN/edit').getBody();

only the 3rd one works.Where I am doing wrong? Because I want to
for(n=1;n < data.length;n++) {... make a loop for and var URL = data[n][COLUMN_URL-1];

您可以添加一些代码以从 URL 获取文档 ID,然后使用

打开文档
DocumentApp.openById(id);

这里有一个 link 可以做到这一点。

下面的示例代码在上述链接答案的帮助下:

function myFunction() {
  var URL = SpreadsheetApp.getActiveSheet().getRange('A1').getValue();
  var id = getIdFrom(URL);

  var doc = DocumentApp.openById(id);

  var body = doc.getBody();
  Logger.log(body.getText());
}


function getIdFrom(url) {
  var id = "";
  var parts = url.split(/^(([^:\/?#]+):)?(\/\/([^\/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?/);
  if (url.indexOf('?id=') >= 0){
     id = (parts[6].split("=")[1]).replace("&usp","");
     return id;
   } else {
   id = parts[5].split("/");
   //Using sort to get the id as it is the longest element. 
   var sortArr = id.sort(function(a,b){return b.length - a.length});
   id = sortArr[0];
   return id;
   }
 }

Demo Google Sheet