您的具体问题是:
我的问题:脚本是否有可能知道第一次出现的值的 A1notation 并在其上方添加一行?
通过结合使用布尔值来指示您是否找到了您正在寻找的任何Range
项目,以及几种方法,您可以获得第一次出现的 A1 表示法。
var column = 1; // this example is only using column A
var foundGerman = false;
var firstGerman = '';
...
if (lang[i] == 'German') {
if (!foundGerman) {
foundGerman = true;
firstGerman = range.getCell(i, column).getA1Notation();
}
...
}
之后,您将拥有包含“德语”的第一个单元格的 A1Notation。
但是,该函数insertRowsBefore()
是一个Sheet
方法,并且需要一个行号作为参数,而不是 A1Notation。因此,弄清楚第一个德国牢房的地址是什么是不必要的。
脚本
这是我的参赛作品!为了速度,明智的做法是使用尽可能少的应用程序脚本服务调用。在这个脚本中,所有的数据操作都是使用数组完成的,最终结果只写一次。
预计您将拥有超过三种您关心的语言,并且为了可维护性,语言查找由 Object 处理,iso639
. (假设您使用的是ISO 639-1 语言代码。)因此,实际工作只需要 10 行代码!
function insertViaArray() {
var sheet = SpreadsheetApp.getActive().getSheetByName('REPORT');
var values = sheet.getDataRange().getValues();
var newValues = [];
var iso639 =
{
"German" : "DE",
"Italian" : "IT",
"French" : "FR"
}
var curLang = '';
for (var i in values) {
if (values[i][0] !== curLang) {
curLang = values[i][0];
newValues.push([iso639[curLang]]);
}
newValues.push([values[i][0]]);
}
sheet.getRange(1, 1, newValues.length, 1).setValues(newValues)
};
编辑脚本 V2
通过使用Array.splice()
插入语言标签,我们可以进一步将代码减少到 8 行工作,并消除对并行newValues
数组的需要。
function insertViaArrayV2() {
var sheet = SpreadsheetApp.getActive().getSheetByName('REPORT');
var values = sheet.getDataRange().getValues();
var iso639 =
{
"German" : "DE",
"Italian" : "IT",
"French" : "FR"
}
var curLang = '';
for (var i = 0; i < values.length; i++) {
if (values[i][0] !== curLang) {
curLang = values[i][0];
values.splice(i, 0, [iso639[curLang]]);
}
}
sheet.getRange(1, 1, values.length, 1).setValues(values)
};