将值复制到同一行的下一列(如果为空)。如果不为空,则复制到同一行的第二列(如果为空)。重复

Copy values to next column(if blank) in the same row. If not blank, copy to the second column(if blank) in same row. Repeat

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

当我 运行 脚本时,它在前两次尝试中运行良好。然后它在那之后不起作用,因为 Q 列现在在列内的其他单元格中有值,并且脚本在技术上是正确的,但不是 运行ning 预期的。我需要忽略非空白的 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 ();
  }
}

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

但是,如果您使用 Apps 脚本方法 isBlank() - 这会使您的代码有点慢。

我建议你

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

示例代码:

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列,可以用script properties保存脚本的运行个计数,奇数和偶数执行不同的代码块。

样本:

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))
}