Код для получения URL-адреса электронной таблицы через его имя и вставки в другую электронную таблицу - PullRequest
0 голосов
/ 26 апреля 2019

Итак, у меня есть лист с 2 столбцами, столбец A - это имя электронной таблицы, а столбец B - это ее URL.Поэтому я использую скрипт для получения URL-адреса через его имя, но последняя строка не работает.Кто-нибудь может мне помочь?

function spreadsheetUrl() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  ss.setActiveSheet(ss.getSheetByName('Page1'));
  var lastRow = ss.getRange("B2:B200").getLastRow();
  var newRow = lastRow+1;
  var range = SpreadsheetApp.getActiveSheet().getRange(newRow, 1);
  var spreadsheetName = range.getValue();
  var files = DriveApp.getFilesByName(spreadsheetName);
  while (files.hasNext()){
     var file = files.next();
     var url = file.getUrl();
     return url
     }

  getValue(url).Paste_Values(getRange(newRow, 2), {contentsOnly: true});
}

Ответы [ 2 ]

0 голосов
/ 26 апреля 2019

Получение URL-адресов электронных таблиц

Одна из проблем, с которыми вы столкнетесь в своем коде, заключается в том, что newrow не меняется, когда вы добавляете больше URL-адресов и фактически хотите, чтобы URL-адрес был рядом с именем файла, а не в конце списка. Эта функция помещает имена файлов, которые находятся в vA1 [i] [0], в столбец urls, который является vA2 [i] [0], а также подсчитывает количество файлов с каждым именем, записывает информацию и отображает ее в диалоговом окне. в конце функции, что дает вам возможность убедиться, что вы получили правильные файлы. Это часто случается, если вы привыкли хранить резервные копии ваших файлов.

Можно также рассмотреть возможность помещения диалога в цикл и, таким образом, позволить вам выбрать, какой из них вы хотите сохранить, но для этого потребуется, чтобы вы смотрели его во время работы функции.

function spreadsheetUrl() {
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getSheetByName('Page1');
  var rg1=sh.getRange(2,1,sh.getLastRow(),1);
  var rg2=sh.getRange(2,2,sh.getLastRow(),1);
  var vA1=rg1.getValues();//Spreadsheet Names
  var vA2=rg2.getValues();//Urls
  var xf=[];
  for(var i=0;i<vA1.length;i++) {
    if(vA1[i][0]) {
      var files=DriveApp.getFilesByName(vA1[i][0]);
      var n=0;
      while (files.hasNext()){
        var file = files.next();
        if(n==0) {
          vA2[i][0]=file.getUrl();
        }else{
          xf.push({name:file.getName(),url:file.getUrl(),id:file.getId()});
        }
        n++;
      }
    }
  }
  rg2.setValues(vA2);
  var html='<h1>You have additional files with the same names</h1>';
  if(xf.length) {
    for(var i=0;i<xf.length;i++) {
      html+=Utilities.formatString('<br />Name: %s Url: %s Id: %s',xf[i].name, xf[i].url,xf[i].id);
    }
    html+='<br /><input type="button" value="Exit" onClick="google.script.host.close();" />';
    var userInterface=HtmlService.createHtmlOutput(html).setWidth(1000);
    SpreadsheetApp.getUi().showModelessDialog(userInterface, "Files with Identical Names")
  }
}

Внесение изменений через Dailog

Я немного поиграл с этим, и эта версия позволяет вам вносить изменения в опубликованные URL-адреса, когда существует более одного файла с заданным именем. Это делается в конце, а не в середине цикла, поэтому вам не нужно делать это несколько раз во время работы цикла. Эта версия также имеет сопутствующую функцию для записи изменений на стороне сервера листов.

function spreadsheetUrl() {
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getSheetByName('Page1');
  var rg1=sh.getRange(2,1,sh.getLastRow(),1);
  var rg2=sh.getRange(2,2,sh.getLastRow(),1);
  var vA1=rg1.getValues();//Spreadsheet Names
  var vA2=rg2.getValues();//Urls
  //rg2.clearContent();//debug
  var xf=[];
  for(var i=0;i<vA1.length;i++) {
    if(vA1[i][0]) {
      var files=DriveApp.getFilesByName(vA1[i][0]);
      var n=0;
      while (files.hasNext()){
        var file = files.next();
        if(n==0) {
          vA2[i][0]=file.getUrl();
        }else{
          xf.push({name:file.getName(),url:file.getUrl(),id:file.getId(),row:i+2});
        }
        n++;
      }
    }
  }
  rg2.setValues(vA2);
  var html='<h1>You have additional files with the same names</h1>';
  html+='<br />Change them if you wish by select the select Me button for the appropriate selection.';
  html+='<br />Press close when you done.';
  if(xf.length) {
    for(var i=0;i<xf.length;i++) {
      html+=Utilities.formatString('<br />Name: %s Id: %s<input type="button" value="Select Me" onClick="selectMe(\'%s\',%s);" />',xf[i].name,xf[i].id,xf[i].url,xf[i].row);
    }
    html+='<br /><input type="button" value="Exit" onClick="google.script.host.close();" />';
    html+='<script>function selectMe(value,row){console.log(value);console.log(row);google.script.run.selectMe("Page1",value,row);}console.log("My Code");</script>';
    var userInterface=HtmlService.createHtmlOutput(html).setWidth(400).setHeight(300);
    SpreadsheetApp.getUi().showModelessDialog(userInterface, "Files with Identical Names")
  }
}

function selectMe(sheetname,value,row) {
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getSheetByName(sheetname);
  var rg=sh.getRange(row,2).setValue(value);
}
0 голосов
/ 26 апреля 2019

Оператор return url в цикле while выходит из функции до запуска getValue.

Я подозреваю, что вы хотите заменить оператор return url на оператор getValue, чтобы он выполнялся длякаждый ряд.

while (files.hasNext()){
   var file = files.next();
   var url = file.getUrl();
   getValue(url).Paste_Values(getRange(newRow, 2), {contentsOnly: true});
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...