2016-09-29 3 views
0

私は彼らへのリンクをスプレッドシート内の他のシートのリストがあるシートを持っています。 リンクは以下のようになります。は唯一のハイパーリンク/参照でシート上の最後の行を取得

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

注最初のシートのみが他のシートと直接的な値にこれらのハイパーリンクと、いくつかの参照(例えば=テストB3!)が含まれていること。

私はgetLastRow(と最後の行を取得しよう)それは常に、実際のリンク/参照で満たされた行の量を無視し、0を返します。また、常に1ので、私はハイパーリンクと参照がセル値としてカウントされないという結論に達しました返し

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); 
} 

:私はhere提案コードを使用する場合 同じことが起こります。参照/ハイパーリンクを含む最後の行を取得し、実際に使用されるシートの最後の行を取得する方法はありますか?機能の 全体コード:

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

私は正確な理由を知りません、それを解決するために、あなたのコードを試してみる必要があります。これは、 'Logger.log(sheet.getLastRow());の前に' SpreadsheetApp.flush(); 'を使用することができます。 –

答えて

0

を助けることができる:最初にコードに見ることができるように を、私は2つの異なるシートの行インデックスに同じ変数名を選択しました。そのため、スクリプトは間違ったスクリプトを作成しました。私はそれを見ないためにかなり愚かな感じ:/。

0

flush()

は、保留中のすべてのスプレッドシートの変更を適用します。スプレッドシートの操作は 時々そのようなRange.getValueに 複数の呼び出し()を行うときのように、パフォーマンスを向上させるために一緒に束ねられています。しかし、時にはあなたは に、すべての保留中の変更は、スクリプトが実行されると、ユーザーのデータを表示するには、インスタンス ため、すぐに作られていることを確認したい場合があります。 Logger.log(sheet.getLastRow());

SpreadsheetApp.flush();私は解決策見つけ

+0

解決策は動作しませんでした、私のコードを提供するつもりです。 – Jonnyboy

+0

うん、混乱については申し訳ありません、フラッシュ()それを解決するように見えたが、それはdoublecheckする幸せに単なる偶然と私でした。 – Jonnyboy

関連する問題