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



免责声明:我是google脚本的新手。我把这段代码拼凑在一起,成败参半。

当我运行该脚本时,它在前两次尝试中运行良好。然后它不工作之后,因为列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 ();
}
}

您需要分别为每个单元格做空白检查

然而,如果你用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))
}

相关内容

最新更新