javascript - 将值复制到同一行中的下一列(如果为空白)。如果不是空白,则复制到同一行的第二列(如果为空白)。重复
问题描述
免责声明:我对谷歌脚本很陌生。我将这段代码混杂在一起,结果喜忧参半。
当我运行脚本时,前两次尝试都能正常工作。然后它在那之后就不起作用了,因为列 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))
}
推荐阅读
- android - 2019年android多模块gradle项目如何汇总测试报告
- php - Problem with add a foreign key to same table in Laravel - Error : "Cannot add foreign key constraint"
- azure - 无法使用 azure Rest API 创建 VM
- c++ - MISRA 警告
- asp.net-mvc - 在 Sitecore MVC 项目中调用 Task.WhenAll 的异步/等待阻塞
- python-3.x - 安装 tensorflow 1.4.0 版
- php - 如何使用产品单页的条件显示小部件
- vue.js - 为什么我的 vue js 数据成员没有更新?
- android - 如何在自定义视图上单击侦听器
- python - Python sqlite如何改变表添加列如果不存在