使用 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 | value1key1 | 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);
}