我目前正在学习Google应用脚本,遇到一个小问题。
背景:我正在从API提取数据,并将其写入电子表格(大多数情况下工作正常),然后对数据进行一些处理。
在某些情况下,由于某种原因,导入无法正常工作。(单元格值:#ERROR!)在这种情况下,我做了一个“复制”功能,将API数据复制到另一张纸上,从而跳过了错误。因此,如果1次导入中断,我可以使用最后一次成功导入。
问题:对于一张纸,运行时间太高,所以我更改了以下代码:
function copy() {
var copyWert = "";
for (var i = 3; i < 247; i++) {
for (var j = 1; j < 4;j++) {
copyWert = SpreadsheetApp.getActive().getSheetByName('API').getRange(i, j).getValue();
if (copyWert == "#ERROR!" || copyWert == "" || copyWert == "#NAME!") {
} else {
SpreadsheetApp.getActive().getSheetByName('Copy').getRange(i, j).setValue(copyWert);
}
}
}
}
至:
function copy() {
var values = SpreadsheetApp.getActiveSheet().getRange("A2:D300").getValues();
SpreadsheetApp.getActive().getSheetByName('Copy').getRange("A2:D300").setValues(values);
}
这是更快的方法,但是缺少检查。有任何想法吗?
我相信您的目标如下。
API
到Copy
当值不为"#ERROR!"
,""
和"#NAME!"
。"#ERROR!"
,""
和的单元格值"#NAME!"
以降低处理成本时,我想使用Sheets API。
"#ERROR!"
,""
并且"#NAME!"
不会被覆盖在现有的细胞Copy
。在这种模式下,当您只想复制没有"#ERROR!"
,""
和的单元格值"#NAME!"
以降低处理成本时,我想使用Sheets API。
使用此脚本之前,请在Advanced Google services中启用Sheets API。
function copy() {
// Ref: https://stackoverflow.com/a/21231012/7108653
const columnToLetter = column => {
let temp,
letter = "";
while (column > 0) {
temp = (column - 1) % 26;
letter = String.fromCharCode(temp + 65) + letter;
column = (column - temp - 1) / 26;
}
return letter;
};
var spreadsheet = SpreadsheetApp.getActive();
var values = spreadsheet.getSheetByName('API').getRange("A2:D300").getValues();
var data = values.reduce((ar, r, i) => {
r.forEach((copyWert, j) => {
if (!(copyWert == "#ERROR!" || copyWert == "" || copyWert == "#NAME!")) {
ar.push({range: `'Copy'!${columnToLetter(j + 1)}${i + 2}`, values: [[copyWert]]});
}
});
return ar;
}, []);
Sheets.Spreadsheets.Values.batchUpdate({data: data, valueInputOption: "USER_ENTERED"}, spreadsheet.getId());
}
在这种模式下,您的第二个脚本将被修改。
function copy() {
var spreadsheet = SpreadsheetApp.getActive();
var values = spreadsheet.getSheetByName('API').getRange("A2:D300").getValues();
values = values.map(r => r.map(copyWert => (copyWert == "#ERROR!" || copyWert == "" || copyWert == "#NAME!") ? "" : copyWert));
spreadsheet.getSheetByName('Copy').getRange("A2:D300").setValues(values);
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句