2016-09-29 3 views
0

У меня есть лист, в котором есть список других листов в электронных таблицах со ссылкой на них. Ссылка выглядит следующим образом:Получение последней строки на листе только с гиперссылками/ссылками

=HYPERLINK(\"https://docs.google.com/spreadsheets/d/"+ssID+"/edit#gid="+sheetID+"\";"+"\""+name+"\")" 

Обратите внимание, что первый лист содержит только эти гиперссылок и несколько ссылок (= Test B3, например!) На другие листы и никаких прямых значений.

Когда я пытаюсь получить последнюю строку с getLastRow(), она всегда возвращает 0, не считая количества строк, на самом деле заполненных ссылками/ссылками. То же самое происходит, когда я использую here предложенный код:

function getFirstEmptyRow(sheet) { 
    var range = sheet.getDataRange(); 
    var values = range.getValues(); 
    for (var row=0; row<values.length; row++) { 
    if (!values[row].join("")) break; 
    } 
    return (row+1); 
} 

Он также всегда возвращает 1. Так я пришел к выводу, что гиперссылки и ссылки не учитываются в качестве значения ячейки. Есть ли способ получить последнюю строку со ссылками/гиперссылками в ней, получив последнюю строку используемого листа? Весь код функции:

function restoreSheet(form) 
{ 
    try 
    { 
     var name = form.pRestore; 
     if (name != "") 
     { 
      var archive = SpreadsheetApp.openById('ID'); 
      var sheet = archive.getSheetByName(name); 
      var list = archive.getSheetByName('list'); 
      var values = list.getDataRange().getValues(); 
      var destination = SpreadsheetApp.openById('ID'); 
      var overview = destination.getSheetByName('cover sheet'); 
      for (var i = 0; i < list.getLastRow(); i++) 
      { 
       if (values[i][0] == name) 
       { 
        var rowIndex = i + 1; 
       } 
       else if (i >= overview.getLastRow()) 
       { 
        return false; 
       } 

      } 
      //erasing stuff on the archives 
      sheet.copyTo(destination).setName(name); 
      archive.deleteSheet(sheet); 
      list.deleteRow(rowIndex); 
      list.sort(1); 
      // adding stuff to the overview 
      var rowindex = getFirstEmptyRow(overview); 
      var ssID = ss.getId(); //ID of the spreadsheet for link creation 
      var oldSheet = ss.getSheetByName(name); 
      if (oldSheet != null) 
      { 
       var sheetID = oldSheet.getSheetId(); //ID of the sheet for link creation 
      } 
      else 
      { 
       Browser.msgBox(oldName + " was not found"); 
      } 
      var link = "=HYPERLINK(\"https://docs.google.com/spreadsheets/d/" + ssID + "/edit#gid=" + sheetID + "\";" + "\"" + name + "\")"; 
      overview.getRange(rowIndex + 1, 3).setValue(link); //Project Name (so that ppl who can only see the sheet can get to the right sheet 
      overview.getRange(rowIndex + 1, 4).setValue("='" + name + "'!B3"); //Project Owner 
      overview.getRange(rowIndex + 1, 5).setValue("='" + name + "'!H1"); //Group 
      overview.getRange(rowIndex + 1, 6).setValue("='" + name + "'!N1"); //Tags 
      overview.getRange(rowIndex + 1, 7).setValue("='" + name + "'!M11"); //Wanted 
      overview.getRange(rowIndex + 1, 8).setValue("='" + name + "'!F1"); //Status 
     } 
     else 
     { 
      Browser.msgBox("Not all required fields filled"); 
      return false; 
     } 
    } 
    catch (e) 
    { 
     Browser.msgBox(e); 
    } 
} 
/** 
* Function to get the first completely empty row 
*/ 
function getFirstEmptyRow(sheet) { 
    var range = sheet.getDataRange(); 
    var values = range.getValues(); 
    for (var row=0; row<values.length; row++) { 
    if (!values[row].join("")) break; 
    } 
    return (row+1); 
} 
+0

Были ли эти гиперссылки созданы скриптом или вставлены вручную? –

+0

Гиперссылки были созданы сценарием, а также ссылками. Но другой функцией. Существует также функция переименования листа. Эта функция сравнивает гиперссылку (getFormular works), а затем создает новую с новым именем листа. Это работает, просто получить последнюю строку нет. – Jonnyboy

+0

Я не знаю точной причины, чтобы решить ее, нужен весь ваш код, чтобы попробовать. Вы можете использовать это: 'SpreadsheetApp.flush();' перед 'Logger.log (sheet.getLastRow());' –

ответ

0

Я нашел решение: Как можно видеть в коде в начале, я выбрал то же имя переменной для 2-х различных индексов листа строк. Это заставило скрипт ошибиться. Я чувствую себя довольно глупым, не видя этого: /.

0

flush()

Применяет все отложенные изменения электронных таблиц. Операции с таблицами: иногда объединяются для повышения производительности, например, при выполнении нескольких вызовов Range.getValue(). Однако иногда вам может потребоваться указать , чтобы все ожидающие изменения были внесены сразу, например , чтобы показывать данные пользователей по мере выполнения сценария.

SpreadsheetApp.flush(); перед тем Logger.log(sheet.getLastRow()); может помочь

+0

Ok. решение не сработало, предоставит мой код. – Jonnyboy

+0

Да, извините за путаницу, флеш(), казалось, решил это, но это было просто совпадение, и я счастлив сменить двойную отметку. – Jonnyboy

Смежные вопросы