javascript 如果单元格为空,则引用同一行中其他列的其他单元格

vojdkbi0  于 2023-01-07  发布在  Java
关注(0)|答案(2)|浏览(219)

我想在G列中这样做:如果单元格'G8'是空的,那么(= K8)例如。我的困难是使引用的同一行在K的空单元格在G。
谢谢你帮忙

我试着改编这个剧本,但我在某个时候得到了转变,我不知道为什么。

function updatewithformula() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('Sheet 1');
  var range = sheet.getDataRange()
  var source = sheet.getRange('G1:G13').getDisplayValues()
  var index = []
  for (var i = 1; i<source.length; i++){
    if (source[i][0] == ""){
      index.push(i+1) 
        }
  }
  index.push(range.getLastRow()+1)
  Logger.log(index)
  for(var i = 0;i<index.length-1;i++){
       var rangetomodify = sheet.getRange(index[i],7,1,1)
       var l = index[i+1]-index[i]-1
      rangetomodify.setFormulaR1C1("=R["+l+"]C[4]")
  }
    
}
dffbzjpn

dffbzjpn1#

作为另一种方法,下面的修改如何?

修改点:

  • 关于I've tryed to adapt this script but I get a shift at some point and I don't know why.,在你的脚本中,"=R[" + l + "]C[4]"是和var l = index[i + 1] - index[i] - 1一起使用的,这种情况下,l不为0的时候,使用另外一行,我想这可能是你出现问题的原因,在你的脚本中,我认为不需要使用var l = index[i + 1] - index[i] - 1,简单修改一下你的脚本,就变成了这样。
function updatewithformula() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('Sheet 1');
  var range = sheet.getDataRange();
  var source = sheet.getRange('G1:G13').getDisplayValues();
  var index = [];
  for (var i = 1; i < source.length; i++) {
    if (source[i][0] == "") {
      index.push(i + 1);
    }
  }
  index.push(range.getLastRow() + 1);
  for (var i = 0; i < index.length - 1; i++) {
    var rangetomodify = sheet.getRange(index[i], 7, 1, 1);
    rangetomodify.setFormulaR1C1("=R[0]C[4]");
  }
}
  • 但是,在这种情况下,getRangesetFormulaR1C1被循环使用,在这种情况下,处理成本变高。

当您的脚本通过降低流程成本进行修改时,下面的修改如何?

修改的脚本:

function updatewithformula() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('Sheet 1');
  var source = sheet.getRange('G2:G13').getDisplayValues();
  var ranges = source.reduce((ar, [g], i) => {
    if (!g) ar.push(`G${i + 2}`);
    return ar;
  }, []);
  sheet.getRangeList(ranges).setFormulaR1C1("=R[0]C[4]");
}
  • 通过RangeList,可以稍微降低处理成本。

参考文献:

  • reduce()
  • 获取范围列表(a1符号)
  • 设置类范围列表的公式R1C1(公式)
nimxete2

nimxete22#

@Shironeki有更好的,容易和简短的方法来做,我已经在这里使用offset
下面是我的作品

function updatewithformula(){
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('Sheet 1');
  var range = sheet.getDataRange()
  var source = sheet.getRange('G1:G13').getValues();
  Logger.log(source);

  
  var index = [];
  for (var i in source){
    if(source[i][0] == ""){
      var j = +i;
      index.push(("G"+(j+1)));
    }
  }
 

  for (var i in index){
    var TEMP = sheet.getRange(index[i]);
    var TEMP1 = TEMP.offset(0,4).getA1Notation();
    const formula = `=${TEMP1}`;
    TEMP.setFormula(formula);

  }
}

希望这个有用。
参考-偏移

相关问题