使用 google apps 脚本复制 sheet 范围内的一些行
Duplicate some rows in a sheet range using google apps script
我的 key -> {list of values}
脚本中有字典
我有一个 sheet 与这些 headers:
key, name
我想遍历 sheet 中的一个范围并添加值行。
说:
k1 -> val1, val2
k2 -> val3
和:
我看到了这个post
问题是在迭代时我改变了范围。
我怎样才能有效地做到这一点?
var rangeValues = searchRange.getValues();
// Loop through array and if condition met, add relevant
// background color.
for ( i = 0; i < lastColumn - 1; i++){
for ( j = 0 ; j < lastRow - 1; j++){
var kw_data = kw_to_label[rangeValues[j][i]];
我试过一些东西,但没有明确说明。我认为您的值列表已硬编码在您的脚本中。基本上你所做的是创建一个新的结果数组并将新值设置为所需的范围。
这个没有测试过但是思路大概是这样的:
const dictionnary = {
'k1': ['val1', 'val2'],
'k2': ['val3']
}
//range in the graphic where you have key and name so always 2 columns
const values = searchRange.getValues()
//future values to populate the spreadsheet with will be a 2D arrya at the end
const newValues = []
//loop through range where there is name and key
for (let row = 0; row < values.length; row++)
//check if key is inside the dictionnary
if (values[row][0] in dictionnary){
//get the list of values inside your dictionnary by key
const tmpArr = dictionnary[values[row][0]]
//loop through list
for (let lign = 0; lign < tmpArr.length; lign++)
//create the new row and push it to newValues
newValues.push([values[row][0], values[row][1], tmpArr[lign]])
}
//generate the desired range of the size of newValues
const newRange = sheet.getRange(desiredRowIndex, desiredColumnIndex, newValues.length, newValues[0].length);
//set values inside range
newRange.setValues(newValues)
解释:
- 遍历源范围内的所有行。
- 对于每一行,检查相应的键是否在脚本对象中。
- 对于此键的值数组中的每个元素,将一个新数组元素推送到二维数组 (
newValues
)。
- 通过setValues(values)将
newValues
写入sheet,其中范围的维度是基于二维数组的维度。
问题:
- 您的 sheet 中有一个范围,每行两列,例如
key | name
。
- 您在脚本中有一个对象具有不同的
keys
(其中每个 key
对应于前面提到的范围内的一个 key
)和每个不同的值的数组 key
,比如 "key1": ["value1", "value2", ...]
.
- 您想修改原始范围,以便对于键中的每个
value
,写入一个新行,如 key1 | name1 | value1
、key1 | name1 | value2
等
解决方案:
您可以执行以下操作:
- 使用 for... in.
遍历对象中的所有键
- 对于每个键,遍历相应数组中的所有值,使用 forEach, and push 一个新的数组元素(值为
key, name, value
)到一个二维数组(在下面的示例)。
- 遍历每个键后,得到一个二维数组
newValues
的范围,并将newValues
的数据写入该范围,使用setValues(values)。
代码示例:
function modifyRange() {
const sheet = SpreadsheetApp.getActiveSheet();
const firstRow = 1; // Please change according to your preferences
const firstCol = 1; // Please change according to your preferences
const searchRange = sheet.getRange(firstRow,firstCol,sheet.getLastRow(),2);
const object = {
"key1": ["value1", "value2"],
"key2": ["value3"],
// ...
}
const values = searchRange.getValues();
const newValues = [];
for (const key in object) {
const row = values.find(row => row[0] === key);
if (row) {
object[key].forEach(keyValue => {
newValues.push([row[0], row[1], keyValue]);
});
}
}
sheet.getRange(firstRow,firstCol,newValues.length,newValues[0].length)
.setValues(newValues);
}
我的 key -> {list of values}
我有一个 sheet 与这些 headers:
key, name
我想遍历 sheet 中的一个范围并添加值行。
说:
k1 -> val1, val2
k2 -> val3
和:
我看到了这个post
问题是在迭代时我改变了范围。 我怎样才能有效地做到这一点?
var rangeValues = searchRange.getValues();
// Loop through array and if condition met, add relevant
// background color.
for ( i = 0; i < lastColumn - 1; i++){
for ( j = 0 ; j < lastRow - 1; j++){
var kw_data = kw_to_label[rangeValues[j][i]];
我试过一些东西,但没有明确说明。我认为您的值列表已硬编码在您的脚本中。基本上你所做的是创建一个新的结果数组并将新值设置为所需的范围。 这个没有测试过但是思路大概是这样的:
const dictionnary = {
'k1': ['val1', 'val2'],
'k2': ['val3']
}
//range in the graphic where you have key and name so always 2 columns
const values = searchRange.getValues()
//future values to populate the spreadsheet with will be a 2D arrya at the end
const newValues = []
//loop through range where there is name and key
for (let row = 0; row < values.length; row++)
//check if key is inside the dictionnary
if (values[row][0] in dictionnary){
//get the list of values inside your dictionnary by key
const tmpArr = dictionnary[values[row][0]]
//loop through list
for (let lign = 0; lign < tmpArr.length; lign++)
//create the new row and push it to newValues
newValues.push([values[row][0], values[row][1], tmpArr[lign]])
}
//generate the desired range of the size of newValues
const newRange = sheet.getRange(desiredRowIndex, desiredColumnIndex, newValues.length, newValues[0].length);
//set values inside range
newRange.setValues(newValues)
解释:
- 遍历源范围内的所有行。
- 对于每一行,检查相应的键是否在脚本对象中。
- 对于此键的值数组中的每个元素,将一个新数组元素推送到二维数组 (
newValues
)。 - 通过setValues(values)将
newValues
写入sheet,其中范围的维度是基于二维数组的维度。
问题:
- 您的 sheet 中有一个范围,每行两列,例如
key | name
。 - 您在脚本中有一个对象具有不同的
keys
(其中每个key
对应于前面提到的范围内的一个key
)和每个不同的值的数组key
,比如"key1": ["value1", "value2", ...]
. - 您想修改原始范围,以便对于键中的每个
value
,写入一个新行,如key1 | name1 | value1
、key1 | name1 | value2
等
解决方案:
您可以执行以下操作:
- 使用 for... in. 遍历对象中的所有键
- 对于每个键,遍历相应数组中的所有值,使用 forEach, and push 一个新的数组元素(值为
key, name, value
)到一个二维数组(在下面的示例)。 - 遍历每个键后,得到一个二维数组
newValues
的范围,并将newValues
的数据写入该范围,使用setValues(values)。
代码示例:
function modifyRange() {
const sheet = SpreadsheetApp.getActiveSheet();
const firstRow = 1; // Please change according to your preferences
const firstCol = 1; // Please change according to your preferences
const searchRange = sheet.getRange(firstRow,firstCol,sheet.getLastRow(),2);
const object = {
"key1": ["value1", "value2"],
"key2": ["value3"],
// ...
}
const values = searchRange.getValues();
const newValues = [];
for (const key in object) {
const row = values.find(row => row[0] === key);
if (row) {
object[key].forEach(keyValue => {
newValues.push([row[0], row[1], keyValue]);
});
}
}
sheet.getRange(firstRow,firstCol,newValues.length,newValues[0].length)
.setValues(newValues);
}