簡體   English   中英

僅在超鏈接/引用中獲取工作表上的最后一行

[英]Getting last Row on Sheet with only hyperlinks/references

我有一張工作表,其中電子表格中有其他工作表的列表,並帶有指向它們的鏈接。 鏈接如下所示:

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

請注意,第一張紙只包含這些超鏈接和一些對其他紙的引用(例如= Test!B3),沒有直接的值。

當我嘗試使用getLastRow()獲取最后一行時,它總是返回0,而忽略實際用鏈接/引用填充的行數。 當我使用此處建議的代碼時,也會發生相同的情況:

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

flush()

應用所有待處理的電子表格更改。 電子表格操作有時會捆綁在一起以提高性能,例如在多次調用Range.getValue()時。 但是,有時您可能需要確保立即進行所有待處理的更改,例如在執行腳本時向用戶顯示數據。

SpreadsheetApp.flush(); Logger.log(sheet.getLastRow()); 能夠幫助

我找到了解決方案:從開頭的代碼可以看出,我為2個不同的工作表行索引選擇了相同的變量名。 這導致腳本采用錯誤的腳本。 我很傻,因為沒有看到它:/。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM