【问题标题】:Search for value and return row number搜索值并返回行号
【发布时间】:2017-08-01 10:16:47
【问题描述】:

我对这个脚本感到困惑。我需要搜索今天的日期,一旦匹配它就会返回列号(完成!)。我需要一个脚本来对行号执行相同的操作。如果我在该工作表上只保留一个表格,我拥有的脚本可以正常工作,但我有更多表格,如果我使用 values.length -1 将返回工作表的最后一行。此外,每个表可能没有固定的行号,因此需要是动态的。

这是我目前的脚本:

function getTodaysTotal() {
  function toDateFormat(date) {
try {return date.setHours(0,0,0,0);}
catch(e) {return;}
 }

var values = SpreadsheetApp
  .openById("id")
  .getSheetByName("Q3 - W27 - 39")
  .getDataRange()
  .getValues();


var today = toDateFormat(new Date());
var todaysColumn = values[5].map(toDateFormat).map(Number).indexOf(+today);
var output = values[values.length - 1][todaysColumn];
var emailDate = Utilities.formatDate(new Date(today),"GMT+1", "dd/MM/yyyy");

这是我桌子的屏幕截图。

table

希望它有意义。我有列号,我需要找到包含 Total 的行号。

谢谢!

亲切的问候

【问题讨论】:

    标签: javascript arrays google-apps-script google-sheets google-apps


    【解决方案1】:

    你必须遍历一个可能是最快的数据数组。

    看看下面的脚本并在你现有的中实现。

    不确定它是否只是您正在查找的一列,但例如 C 列:

    for (i in values){
    if (values[i][2]=='Total'){
    Logger.log(i);
    var nr = i
       }
    }
    

    var nr 现在包含 i 作为它在 C 列中找到单词“Total”的行号([i] 之后的 #2)。

    然后,您可以在第一个右括号之后的任何您想要的变量中使用该变量。

    【讨论】:

    • 我不断收到此错误:TypeError:无法从未定义中读取属性“32”。 (第 25 行,文件“Utils”)
    • 脚本中当前未定义某些变量。我在上面放置的脚本必须嵌入到您的完整脚本中,包括使用的变量。使用调试器和记录器。代码中的第 25 行是什么?分享您的工作表和完整代码。
    • 所以第 25 行是变量输出,属性可能是 IF 语句返回的行号。似乎您将脚本的其余部分保留在 if 语句循环中。确保在继续之前关闭 IF 语句。 IF 语句用于分配变量,但如果您在使用该变量之前不关闭 IF 语句,它将是未定义的。请先关闭该循环,然后再试一次。在变量 Newnr 下方放置一个“}”。
    • 仍然出现错误...这是我的文件的副本...我需要获取第一个总数(行号)...drive.google.com/…
    【解决方案2】:

    我将此添加到我的脚本中,但我在输出时未定义。如果我使用记录器日志,我会得到正确的值,但我也会得到一个空值(未定义)。所以我只需要第一个值。

    function getTodaysTotal() {
     function toDateFormat(date) {
    try {return date.setHours(0,0,0,0);}
    catch(e) {return;}
       }
    
    var values = SpreadsheetApp
      .openById("id")
      .getSheetByName("Q3 - W27 - 39")
      .getDataRange()
      .getValues();
    
    for (i in values){
     if (values[i][0]=='Total'){
     var nr = i;
     var newNr = parseInt(nr);
    
     //       Logger.log(nr);
    
    
    var today = toDateFormat(new Date());
    var todaysColumn = 
     values[5].map(toDateFormat).map(Number).indexOf(+today);
    var output = values[newNr][todaysColumn];
     Logger.log(output);
    var emailDate = Utilities.formatDate(new Date(today),"GMT+1", "dd/MM/yyyy");
    //   Logger.log(todaysColumn);
    //    Logger.log(output);
    // return values[values.length - 1][todaysColumn];
    }
     }
    
    
    
    
     if (output == undefined) {
    GmailApp.sendEmail("email@company.com", "test data", "Today, " +emailDate +" we had no calls made or no values are inputed.");   
     }
     else if (output == "") {
    GmailApp.sendEmail("email@company.com", "test data", "Today, " +emailDate +" we had no calls made or no values are inputed.");
    }
     else {
    
    GmailApp.sendEmail("email@company.com", "test data", "Today, " +emailDate +" we had " +output + " calls made.");
    
    }
     }
    

    【讨论】:

    • 不幸的是,我现在无法访问我所在的谷歌驱动器。似乎如果你得到正确的值和一个空值,你的变量 todaysColumn 可能是空的。将您的记录器更改为变量 todaysColumn 以了解值是什么。映射到 (toDateFormat) 后,您似乎无法映射到数字。你想要两者的原因是什么?
    猜你喜欢
    • 1970-01-01
    • 2016-01-10
    • 2014-11-22
    • 2014-07-26
    • 2012-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多