私は彼らへのリンクをスプレッドシート内の他のシートのリストがあるシートを持っています。 リンクは以下のようになります。は唯一のハイパーリンク/参照でシート上の最後の行を取得
=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);
}
は、これらのハイパーリンクは、スクリプトによって行われたか、手動で貼り付けされていますか? –
ハイパーリンクは、スクリプトと参照によって作成されています。しかし、別の機能によって。シートの名前を変更する機能もあります。この関数は、ハイパーリンク(getFormular works)を比較し、新しいシート名で新しいものを作成します。それはうまくいきます、ちょうど最後の行を取得していません。 – Jonnyboy
私は正確な理由を知りません、それを解決するために、あなたのコードを試してみる必要があります。これは、 'Logger.log(sheet.getLastRow());の前に' SpreadsheetApp.flush(); 'を使用することができます。 –