【问题标题】:How to insert a cell with value on every Nth row in a column in Google Sheets如何在Google表格的列中的每第N行插入一个具有值的单元格
【发布时间】:2019-09-25 12:16:09
【问题描述】:

在一列中有一个不同值的列表作为连续列表(数组)。
我们需要通过在它们之间插入一些文本将它们分组并在另一列中每隔 N 行(第 7 行)分隔。 不是一整行。只是一个细胞。结果它们将被“下推”列。


+------+-----------+-----------+
|      |   Col2    |  Col3     |
+------+-----------+-----------+
|    1 | Sunday    | Group 01  |
|    2 | Monday    | Sunday    |
|    3 | Tuesday   | Monday    |
|    4 | Wednesday | Tuesday   |
|    5 | Thursday  | Wednesday |
|    6 | Friday    | Thursday  |
|    7 | Saturday  | Friday    |
|    8 | 10        | Saturday  |
|    9 | 20        | Group 02  |
|   10 | 30        | 10        |
|   11 | 40        | 20        |
|   12 | 50        | 30        |
|   13 | 60        | 40        |
|   14 | 70        | 50        |
|   15 | MERCURY   | 60        |
|   16 | MARS      | 70        |
|   17 | JUPITER   | Group 03  |
|   18 | VENUS     | MERCURY   |
|   19 | SATURN    | MARS      |
|   20 | EARTH     | JUPITER   |
|   21 | NEPTUNE   | VENUS     |
|   22 | Mary      | SATURN    |
|   23 | John      | EARTH     |
|   24 | Paul      | NEPTUNE   |
|   25 | Ann       | Group 04  |
|   26 | ...       | Mary      |
|   27 | ...       | John      |
|   28 |           | Paul      |
|   29 |           | Ann       |
|   30 |           |           |
|   31 |           |           |
|   32 |           |           |
|   33 |           |           |
+------+-----------+-----------+

到目前为止,我已经尝试并成功地通过使用一个简单的查询获得了所需的结果:

=QUERY(({"***Group";B1:B7;"***Group";B8:B14;"***Group";B15:B21;"***Group";B22:B25;}),"SELECT *")

我想知道。是否有更“优雅”以及通用方式使用公式或脚本

【问题讨论】:

  • 您想在每 7 个现有条目之后在 B 列中插入一个包含一些文本的单元格吗?或者您想将 B 列中的值复制到 C 列,从而在每 7 个条目之间插入一个额外的单元格?
  • @ziganotschka 是的。在这种情况下,有 7 个现有条目。但是对于很多条目的扩展列。不仅是现有的 7 个条目。另一个时间可能是 5 或 9 或.... 请注意文本末尾的增量值以及“Group 01
  • 我很困惑如何“切割集群”并使它们动态化,而不必明确地写出每一个。
  • 很容易编写一个脚本,将 B 列中的值推送到数组中,每 7 个(或任何其他固定编号)条目插入一个附加条目,并将整个结果传递到 C 列。但是,如果您的增量值在同一列中并不总是相同 - 脚本应该如何知道在哪里应用哪个间隔?
  • 总是一样的。我的意思是另一次。

标签: google-apps-script google-sheets google-sheets-formula array-formulas google-sheets-query


【解决方案1】:

我建议您使用以下基于 Apps Script 的解决方案:

function myFunction() {
  var sheet=SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1');
  var firstRow=1;
  var column=2;
  var destColumn=3;
  var increment=7;
  var lastRow=sheet.getLastRow();
  var values=sheet.getRange(firstRow, column, lastRow,1).getValues();
  var array=[];
  var k=1;
  Logger.log(lastRow);
  for(var i=0;i<lastRow;i++){
    if(i%increment==0){
      array.push("Group "+k);
      k++;
    }
     array.push(values[i][0]);
  }
  var outerArray = [];
  for(var j=0;j<array.length;j++){
    var tempArray = [];
    tempArray.push(array[j]);
    Logger.log(array[j]);
    Logger.log(tempArray);
    outerArray.push(tempArray);
  }
  sheet.getRange(1, destColumn, array.length, 1).setValues(outerArray);
}

工作流程:

  • 将感兴趣列的内容推送到数组中
  • 每隔incrementth 次插入一个包含内容的附加条目
  • 将数组转置为[column][row] 语法
  • 将值插入目标列

参考资料:

【讨论】:

  • “几乎”完美运行。只有一个问题。虽然它应该停止 - 在我们的例子中 - 在Group 4 它最后添加至少一个额外的组加上几行。如果我们更改增量/步长(例如 5),它会增加更多。如果可以将其转换为具有相应变量rowcolumndestination 之类的函数,那将是一个很好的改进,因此不必进入脚本编辑器,只需在单元格中编写函数.
  • "...函数类似于 =insertcell(1,2,7) 和对应的变量 row, column, destination "。仔细想想,变量destination 是没有意义的。这将是函数所在单元格的地址。最好有一个选项 -10- 是否让第一个(在列的最顶部)Group1 出现。所以可能是=insertcell(2, 7, 0)
  • 如果脚本添加了额外的行,可能您的工作表中在感兴趣的列的最后一个条目之后还有额外的空单元格,而不是 var lastRow=sheet.getLastRow(); 您可以定义 var lastRow=sheet.getRange(firstRow, column).getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow(); 为了不打开脚本编辑器 - 您可以将脚本作为宏运行。只需转到工具->宏->导入并将函数添加到宏列表。否则,您也可以按照上面的建议重写脚本。我的答案中的参考资料应该可以帮助您根据需要调整示例脚本。
【解决方案2】:

您可以使用Array.splice 每第 N 行插入数组:

/**
 * Inserts string every nth row
 *
 * @customfunction
 * @param {Object[][]} arr Input Column
 * @param {number} every Nth row to insert
 * @param {string} str String to insert
 */
function insertText(arr, every, str) {
  for (
    var i = 0, j = 0;
    i < arr.length - 1 && arr.splice(i++, 0, [str + ++j]);
    i += every
  );
  return arr;
}
const arr = [ //Input col A1:A25 looks like this 
  ['Sunday'],
  ['Monday'],
  ['Tuesday'],
  ['Wednesday'],
  ['Thursday'],
  ['Friday'],
  ['Saturday'],
  ['10'],
  ['20'],
  ['30'],
  ['40'],
  ['50'],
  ['60'],
  ['70'],
  ['MERCURY'],
  ['MARS'],
  ['JUPITER'],
  ['VENUS'],
  ['SATURN'],
  ['EARTH'],
  ['NEPTUNE'],
  ['Mary'],
  ['John'],
  ['Paul'],
  ['Ann'],
];
console.log(insertText(arr, 7, 'Group'));

【讨论】:

  • 感谢您的建议。不是说具体数值要一一输入吗?我正在寻找使用变量的更通用的方法。还有其他建议吗?
  • 作为mentioned before,人们甚至不必弄乱脚本,只需在工作表上键入一个函数(如=insertcell(2, 7, 0))。
  • @mari 您至少应该尝试创建自己的自定义函数。如果你有,你会意识到这是一个自定义函数。 =INSERTTEXT(A2:A15,7,"Group")
  • 感谢您的提醒。还有教育性的负面评论。它让我有机会回忆infamous Milgram Experiment
  • @mari 我不确定我是否了解相关性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-08
  • 2020-07-31
  • 2011-08-23
  • 1970-01-01
相关资源
最近更新 更多