首页 > 解决方案 > 将值复制到同一行中的下一列(如果为空白)。如果不是空白,则复制到同一行的第二列(如果为空白)。重复

问题描述

免责声明:我对谷歌脚本很陌生。我将这段代码混杂在一起,结果喜忧参半。

当我运行脚本时,前两次尝试都能正常工作。然后它在那之后就不起作用了,因为列 Q 现在在列内的其他单元格中具有值,并且脚本在技术上是正确的,但没有按预期运行。我需要忽略不为空白的 Q 列单元格,并仍然运行脚本将 P 值复制到 Q 列中的其他单元格。

此外,当同一行中的 Q 列不为空白时,我需要将 P 列中的值复制到 R 列(如果为空白)。冲洗并重复脚本...

  function copyVals () {
  var ss = SpreadsheetApp.getActiveSpreadsheet ();
  var source = ss.getRange ("Sheet1!P2:P");
  var destSheet = ss.getSheetByName("Sheet1");
  var destRange = destSheet.getRange('Q2:Q')
  var destRange2 = destSheet.getRange('R2:R')
    if (destRange.isBlank()) {
  source.copyTo (destRange, {contentsOnly: true});
  source.clear ();
  } 
    if (destRange2.isBlank()) {   
   source.copyTo (destRange2, {contentsOnly: true});
   source.clear ();
  }
}

标签: javascriptgoogle-apps-scriptgoogle-sheetsshare

解决方案


您需要分别对每个单元格进行空白检查

但是,如果您使用 Apps Script 方法执行此操作isBlank()- 这会使您的代码有点慢。

我建议你

  • 使用getValues检索源范围和目标范围中的现有值
  • 检查每个目标值是否为空并通过源值替换空值
  • 使用setValues将修改后的值分配回工作表

示例代码:

function copyVals () {
  var ss = SpreadsheetApp.getActiveSpreadsheet ()
  var sheet = ss.getSheetByName("Sheet1")
  var lastRow = sheet.getLastRow()
  var source = sheet.getRange ("P2:P" + lastRow)
  var destSheet = sheet
  var destRange = destSheet.getRange('Q2:Q' + lastRow)
  var destRange2 = destSheet.getRange('R2:R' + lastRow)
  var sourceValues = source.getValues().flat()
  var destValues = destRange.getValues()
  var dest2Values = destRange2.getValues()
  sourceValues.forEach(function(value, i){
  console.log("i" + i)
    if (destValues[i][0] == "") {
      destValues[i][0] = value
    } 
    if (dest2Values[i][0] == "") {
      dest2Values[i][0] = value
    } 
  })
  destRange.setValues(destValues)
  destRange2.setValues(dest2Values)
  source.clear ();
}

更新

如果要交替复制到 Q 和 R 列,可以使用脚本属性保存脚本的运行次数,并对奇数和偶数执行不同的代码块。

样本:

function copyVals () {
  var ss = SpreadsheetApp.getActiveSpreadsheet ()
  var sheet = ss.getSheetByName("Sheet1")
  var lastRow = sheet.getLastRow()
  var source = sheet.getRange ("P2:P" + lastRow)
  var destSheet = sheet
  var destRange = destSheet.getRange('Q2:Q' + lastRow)
  var destRange2 = destSheet.getRange('R2:R' + lastRow)
  var sourceValues = source.getValues().flat()
  var destValues = destRange.getValues()
  var dest2Values = destRange2.getValues()
  
  var scriptProperties = PropertiesService.getScriptProperties()
  var myProperty = scriptProperties.getProperty('timesCalled')
  if (!myProperty){
    myProperty = "1"
    }

    myProperty = JSON.parse(myProperty)
    var isOdd =  myProperty % 2
    if(isOdd){
    sourceValues.forEach(function(value, i){
      console.log("i" + i)
      if (destValues[i][0] == "") {
        destValues[i][0] = value
      }  
    })
    destRange.setValues(destValues)
    
  } else{
    sourceValues.forEach(function(value, i){
      if (dest2Values[i][0] == "") {
        dest2Values[i][0] = value
      } 
    })
    destRange2.setValues(dest2Values)
  }
  source.clear ()
  myProperty++
  scriptProperties.setProperty('timesCalled', JSON.stringify(myProperty))
}

推荐阅读