使用超链接/引用获取Sheet上的最后一行

时间:2016-09-29 12:12:46

标签: google-apps-script google-sheets

我有一张表格,其中有电子表格中其他表格的列表,并附有指向它们的链接。 链接看起来像这样:

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

请注意,第一张工作表仅包含这些超链接和一些引用(例如,测试!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);
}

2 个答案:

答案 0 :(得分:0)

  

flush()

     

应用所有待处理的电子表格更改。电子表格操作是   有时捆绑在一起以提高性能,例如在做的时候   多次调用Range.getValue()。但是,有时您可能想要   例如,确保立即进行所有挂起的更改   在脚本正在执行时显示用户数据。

SpreadsheetApp.flush();之前的

Logger.log(sheet.getLastRow());可以提供帮助

答案 1 :(得分:0)

我找到了解决方案: 从开头的代码中可以看出,我为2个不同的表行索引选择了相同的变量名。这导致脚本错误。我没有看到它感到非常愚蠢:/。