【问题标题】:Fill in cells in specific columns if cells are blank如果单元格为空白,请填写特定列中的单元格
【发布时间】:2020-02-16 23:22:14
【问题描述】:

您好,我希望将我在旧帖子中看到的这个函数编辑为更具动态性的功能,并且实际上可以填充右列的空白,因为现在它正在填充 B 列而不是 D 中的空白。这是我的功能

function Absent() {
  var tss = SpreadsheetApp.getActiveSpreadsheet();
  var values = tss.getRange("Attendance!D1:D20").getValues();

  for(i=0; i<values.length; i++) {
    var value = values[i][0];

    if (value == "") {
      var rangeB = tss.getSheetByName("Attendance").getRange(i+1,2);

      if(!rangeB.isBlank()) {
        rangeB.setValue("A");
      }
    }
  }
}

我目前的情况是A列中有名称在“D”、“H”、“J”、“L”、“N”、“P”列中标有P(因为它们存在) ,"R","T","V","X","Z","AB","AF","AH","AJ","AL","AN" 不在场的人留空,但当我通过按钮运行脚本时,我想用 A 填充它们。在这里你可以看到sheet. 下面的脚本是我首先运行的,将 Ps 添加到在场的每个人,但我不确定如何编辑到添加 P 后它会返回的位置,如果找不到名称,则放置一个 A,这就是我这样做的原因第二个脚本。但是,如果有一种方法可以将它添加到这个中,那就太好了!


  var sprsheet = SpreadsheetApp.getActiveSpreadsheet();
  var transpose = sprsheet.getSheetByName("Transpose");
  var attendance = sprsheet.getSheetByName("Attendance");

  //Ranges of Transpose
  var colDates = transpose.getRange("D1:BU1").getValues();
  var attendees = transpose.getRange("D2:BU2").getValues();

  //Ranges of Attendance
  var eventsCol = ["D","H","J","L","N","P","T","V","X","Z","AB","AF","AH","AJ","AL","AN","AR","AT","AV","AX","AZ","BD","BF","BH","BJ","BL","BP","BR","BT","BV","BX","BZ"]; //Add Column letters is need more dates added 
  var kids = attendance.getRange("A2:A205").getValues(); //Increase this if you add more names 

  loop1:
  for (var i = 0; i < eventsCol.length; i++){ //For each column 

    var list = getIndividuals(attendees[0][i]); //Get the list of each Transpose row 2

    loop2:
    for (var x = 0; x < kids.length; x++){ //For each name in Attendance

      loop3:
      for (var y = 0; y < list.length; y++){ //Compare it with each name of the list

        if (list[y] == kids[x][0] || list[y] == " " + kids[x][0]){ //Second "or" is in case there is an space in the first position.

        attendance.getRange(eventsCol[i]+(x+2)).setValue("P");

          break loop3; //Once it finds a name it makes no sense to keep searching. Go back to the next name.

         }         
        } 

      }

    }
  }


//Split the list into each name, removing the first space
function getIndividuals(attendees){

  var individuals = attendees.split(",");

  for (var i = 0; i < individuals.length; i++){ 

    if (individuals[i][0] == " "){

      individuals[i][0].replace(" ", "");

    }

  }

  return individuals;
}

【问题讨论】:

  • 我很乐意提供帮助。我可以看看你的工作表的图片吗?
  • @Cooper 我刚刚上传了一张它的图片。它也在帖子上链接。非常感谢!
  • 这些列"D","H","J","L","N","P","R","T","V","X","Z","AB","AF","AH","AJ","AL","AN" 似乎与您的图像不一致。
  • 您有当前出勤脚本的副本吗?
  • @Cooper 我不知道如何在此处将我的脚本作为评论发布,所以我只是将其添加到我的帖子中。另外,我很确定您命名的列确实匹配,因为那是我将 Ps 填充到其中的地方。希望这是有道理的

标签: if-statement google-apps-script google-sheets


【解决方案1】:

用 A 填空

嗯。很棒的学校。即使你没有出现,你也会得到 A。

function fillTheEmptiesWithA() {
  var ss=SpreadsheetApp.getActive();
  var cols= ["D","H","J","L","N","P","R","T","V","X","Z","AB","AF","AH","AJ","AL","AN"];
  var sh=ss.getSheetByName('Attendance');
  var sr=3;
  cols.forEach(function(c,i){
    var col=sh.getRange(c+1).getColumn();
    var rg=sh.getRange(sr,col,sh.getLastRow()-sr+1,1)
    var vals=rg.getValues();
    vals.forEach(function(p,j,v){if(p==''){v[j][0]='A';}});
    rg.setValues(vals);
  });
}

根据var kids = attendance.getRange("A2:A205").getValues();,您的数据从第 2 行开始。根据您的图像,您的数据从第 3 行开始。我将 startRow(sr) 放入代码中,以便您决定稍后是哪一个。

动画:

*此版本仅在每列标题行不为空时填充 Empties

function runTwo() {
  var ss=SpreadsheetApp.getActive();
  var cols= ["D","H","J","L","N","P","R","T","V","X","Z","AB","AF","AH","AJ","AL","AN"];
  var sh=ss.getSheetByName('Attendance');
  var sr=3;
  cols.forEach(function(c,i){
    var col=sh.getRange(c+1).getColumn();
    if(sh.getRange(sr-1,col).getValue()!='') {
      var rg=sh.getRange(sr,col,sh.getLastRow()-sr+1,1)
      var vals=rg.getValues();
      vals.forEach(function(p,j,v){if(p==''){v[j][0]='A';}});
      rg.setValues(vals);
    }
  });
}

【讨论】:

  • 首开先河!我没有看到我确实从 2 开始,但 3 实际上是正确的。其次,很棒的笑话大声笑(A=缺席)。最后,非常感谢你,这就像一个魅力,我非常感激我被困了几个小时试图弄清楚。再次感谢@Cooper
  • 嗨@Rihco!如果它对您有用,请接受@cooper 的回答,以便我们知道这是正确的解决方案。
  • @Cooper 是否可以添加一条语句,仅在列标题有文本时才显示类似填充的内容?问题是我们运行的是每日报告而不是学期报告,因此理想情况下我们会每天运行此脚本。
  • @MateoRandwolf 我要求编辑,但我会接受它完全完成,谢谢提醒。
  • 是的 列标题请求很简单。我收集到你说其中一些专栏还没有日期。我会在大约一个小时内完成。
【解决方案2】:

您当前的脚本执行以下操作: 1) 检索 D1:10 2) 检查 D1:D10 的值,看看哪个是空的 3) 如果范围为空,则在第 2 列设置 A 的值。

以下脚本将: 1)检查给定范围 2)检查空值 3) 在相同的范围内设置 A 的值

  var app = SpreadsheetApp;
  var ss = app.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();

  var checkrange = sheet.getRange(2,1,9,1).getValues(); //range to check getRange(starting row, starting column,number of rows to check, number of column to check)

  for( i=0; i<checkrange.length; i++){ 
    var content = checkrange[i];

    if (content ==""){
      sheet.getRange(i+2,1).setValue("A"); //plus 1 because first item in array is a 0, but it would be in row 1, plus another 1 because of header. to change the column, change the 1 to whichever column you need
    }
  }
}

【讨论】:

  • 我似乎无法让它工作。由于某种原因,当我运行脚本时没有任何反应。你能检查我是否有什么问题。 docs.google.com/spreadsheets/d/…
  • 另外,我认为这可能希望在每个空的单元格中放置一个 A,而不管其所在的列。我希望它只检查特定列的范围
猜你喜欢
  • 2019-08-21
  • 1970-01-01
  • 2021-11-15
  • 1970-01-01
  • 2021-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多