- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我长期使用的电子表格技术之一是就地复制/粘贴特殊值 (C/PSV)。使用公式生成我感兴趣的值后,我 C/PSV 然后可以删除源数据。
所以我写了一个使用这种技术的宏,但是单元格最终还是空的。但是,如果我将宏分成两部分,在 C/PSV 之前结束第一个宏,那么一切都会按预期进行。为什么是这样?有没有更好的方法来解决这个问题?这是我的三个宏。
function Step1() {
var spreadsheet = SpreadsheetApp.getActive();
var range = spreadsheet.getActiveRange();
CopyRangeToNewSheet(spreadsheet, range);
spreadsheet.getCurrentCell().offset(-1, 6).activate();
FillInHeaders(spreadsheet);
spreadsheet.getCurrentCell().offset(1, -4).activate();
FillInFormulas(spreadsheet);
spreadsheet.getCurrentCell().offset(0, -4, range.getNumRows(), 5).activate();
spreadsheet.getCurrentCell().offset(0, 0, 1, 5).copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
};
function Step2() {
var spreadsheet = SpreadsheetApp.getActive();
var keepers = spreadsheet.getRange('G:J');
keepers.activate();
keepers.copyTo(keepers, SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
var discard = spreadsheet.getRange('A:F')
discard.activate();
spreadsheet.getActiveSheet().deleteColumns(discard.getColumn(), discard.getNumColumns());
};
function BothSteps() {
var spreadsheet = SpreadsheetApp.getActive();
var range = spreadsheet.getActiveRange();
CopyRangeToNewSheet(spreadsheet, range);
spreadsheet.getCurrentCell().offset(-1, 6).activate();
FillInHeaders(spreadsheet);
spreadsheet.getCurrentCell().offset(1, -4).activate();
FillInFormulas(spreadsheet);
spreadsheet.getCurrentCell().offset(0, -4, range.getNumRows(), 5).activate();
spreadsheet.getCurrentCell().offset(0, 0, 1, 5).copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
var keepers = spreadsheet.getRange('G:J');
keepers.activate();
keepers.copyTo(keepers, SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
var discard = spreadsheet.getRange('A:F')
discard.activate();
spreadsheet.getActiveSheet().deleteColumns(discard.getColumn(), discard.getNumColumns());
};
function FillInHeaders(spreadsheet) {
spreadsheet.getCurrentCell().setValue('First Name');
spreadsheet.getCurrentCell().offset(0, 1).activate();
spreadsheet.getCurrentCell().setValue('Last Name');
spreadsheet.getCurrentCell().offset(0, 1).activate();
spreadsheet.getCurrentCell().setValue('Middle Name');
spreadsheet.getCurrentCell().offset(0, 1).activate();
spreadsheet.getCurrentCell().setValue('Email');
}
function FillInFormulas(spreadsheet) {
spreadsheet.getCurrentCell().setFormulaR1C1('=find(" ",R[0]C[-2])');
spreadsheet.getCurrentCell().offset(0, 1).activate();
spreadsheet.getCurrentCell().setFormulaR1C1('=if(iserr(R[0]C[-1]),R[0]C[-3],mid(R[0]C[-3],1,R[0]C[-1]))');
spreadsheet.getCurrentCell().offset(0, 1).activate();
spreadsheet.getCurrentCell().setFormulaR1C1('=if(iserr(R[0]C[-2]),"",mid(R[0]C[-4],R[0]C[-2]+1,50))');
spreadsheet.getCurrentCell().offset(0, 2).activate();
spreadsheet.getCurrentCell().setFormulaR1C1('=R[0]C[-5]');
}
function CopyRangeToNewSheet(spreadsheet, range) {
var newSheet = spreadsheet.insertSheet(1);
spreadsheet.setActiveSheet(newSheet, true);
spreadsheet.getCurrentCell().offset(1, 0).activate();
range.copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
}
这是电子表格本身,带有 Main、Result of Step1、Step2 和 Result of Combined Steps 选项卡: https://docs.google.com/spreadsheets/d/1_nabq_mHuegz_eMIPPAlIgonv71Jh6OPi6qKzeNGGTI/edit?usp=sharing
最佳答案
SpreadsheetApp.flush()
可能是您的宏中缺少的步骤。基本上,Apps 脚本会在内部优化读取和写入,如果您不调用此方法,它可以按照自己的方式自由执行操作。
在您当前将任务分成“宏 1”和“宏 2”的位置添加此内容应该可以解决问题:
...
spreadsheet.getCurrentCell().offset(0, 0, 1, 5).copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
// Force formulas to calculate and pending writes to be written.
SpreadsheetApp.flush();
// Read formula results and save as values.
var keepers = spreadsheet.getRange('G:J');
...
另一种方法是通过使用 setValues()
而不是 将您的脚本从录制宏的“事务性”方法压缩为批处理/高效的“大图” View >复制到
:
...
SpreadsheetApp.flush();
var toKeep = spreadsheet.getRange('G:J');
toKeep.setValues(toKeep.getValues());
toKeep.getSheet().deleteColumns(1, toKeep.getColumn() - 1);
}
请注意,您仍然需要调用 .flush()
。
关于google-apps-script - 为什么 copyTo(... PASTE_VALUES) 在宏中间不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50192942/
我长期使用的电子表格技术之一是就地复制/粘贴特殊值 (C/PSV)。使用公式生成我感兴趣的值后,我 C/PSV 然后可以删除源数据。 所以我写了一个使用这种技术的宏,但是单元格最终还是空的。但是,如果
我长期使用的电子表格技术之一是就地复制/粘贴特殊值 (C/PSV)。使用公式生成我感兴趣的值后,我 C/PSV 然后可以删除源数据。 所以我写了一个使用这种技术的宏,但是单元格最终还是空的。但是,如果
我是一名优秀的程序员,十分优秀!