在Google电子表格中移动值

时间:2013-07-01 12:44:18

标签: javascript google-apps-script google-sheets

我正在制作一个电子表格,用于预订我所属俱乐部的设备。我正在寻找一种方法,使电子表格的选定区域中的所有单元格在午夜向左移动一个,并且一直向左移动一些单元格。我知道我可以使用触发器执行此操作,但是我不知道如何编写函数来执行此操作。

任何帮助或建议都将不胜感激。

1 个答案:

答案 0 :(得分:2)

如果您有一个可以左移二维数组内容的函数,这将很简单。有了这个,你可以做类似以下的事情。有关方法详细信息,请参阅documentation

  • 使用Sheet.getRange()定义要移动的范围。

  • 使用Range.getValues()获取包含要移位的所有数据的数组。

  • 移动数组内容。

    var result = [];
    for (var r=0; r<array2d.length; r++) {
      var row = array2d[r].slice(0);
      var rotVal = row.shift();
      row.push(''); // preserve row width by adding a blank value
      result.push(row);
    }
    
  • 使用Range.setValues()将移位的数组值写入前一个范围。

注意:只有这样才能保留值,没有公式,没有格式化。如果你想要格式化,你可以得到它的数组并以类似的方式操作它。由于相对参考的影响,公式更加棘手。

shiftArray函数

上面的代码片段是此函数的摘录,可以向左,向右,向上或向下移动数组,还支持“旋转”概念(从行或列的一端拉出的值放置在另一端,而不是空白)。为了确保源数组保持不变,它依赖于deepCopy()函数。

/**
 * Shift the contents of a two-dimensional array in given direction,
 * with rotate option. Can be used as a spreadsheet custom function.
 * Dimensions of resulting array correspond to input array.
 *
 * Written for http://stackoverflow.com/questions/17404787 by Mogsdad
 *
 * @param {Array}   array2d    Two-dimensional array input
 * @param {String}  direction  One of {'left', 'right', 'up', 'down'},
 *                             defaults to 'left'.
 * @param {Boolean} rotate     Set true if shifted value should be
 *                              rotated to other end, default false.
 *
 * @returns {Array}            Two-dimensional array result
 */
function shiftArray( array2d, direction, rotate ) {
  direction = direction || 'left';
  rotate = rotate || false;
  var result = [];

  switch (direction) {
    case 'left':
      for (var r=0; r<array2d.length; r++) {
        var row = array2d[r].slice(0);
        var rotVal = row.shift();
        row.push(rotate ? rotVal : '');
        result.push(row);
      }
      break;

    case 'right':
      for (var r=0; r<array2d.length; r++) {
        var row = array2d[r].slice(0);
        var rotVal = row.pop();
        row.unshift(rotate ? rotVal : '');
        result.push(row);
      }
      break;

    case 'up':
      result = deepCopy(array2d);
      var rotRow = result.shift();
      if (!rotate)
        // empty all elements in rotRow
        for (var c=0; c<rotRow.length; c++)
          rotRow[c]='';
      result.push(rotRow);
      break;

    case 'down':
      result = deepCopy(array2d);
      var rotRow = result.pop();
      if (!rotate)
        // empty all elements in rotRow
        for (var c=0; c<rotRow.length; c++)
          rotRow[c]='';
      result.unshift(rotRow);
      break;

    default:
      throw new Error( "Unknown direction '"+direction+"'" );
  }
  return result;
}

/**
 * Return a deep copy of the given object.
 *
 * From: http://james.padolsey.com/javascript/deep-copying-of-objects-and-arrays/#comment-10679
 */
function deepCopy(o) {
    var copy = o,k;

    if (o && typeof o === 'object') {
        copy = Object.prototype.toString.call(o) === '[object Array]' ? [] : {};
        for (k in o) {
            copy[k] = deepCopy(o[k]);
        }
    }
    return copy;
}