如何在 Google 表格中创建“反向数据透视表”?

2023-12-28

我正在尝试生成一个“反向枢轴”功能。我一直在努力寻找这样的功能,但找不到已经存在的功能。

我有一个汇总表,其中最多有 20 列和数百行,但是我想将其转换为平面列表,以便我可以导入到数据库(甚至使用平面数据来创建更多数据透视表!)

所以,我有这种格式的数据:

Customer 1 Customer 2 Customer 3
Product 1 1 2 3
Product 2 4 5 6
Product 3 7 8 9

并且需要将其转换为这种格式:

 Customer  |  Product  | Qty
-----------+-----------+----
Customer 1 | Product 1 |   1
Customer 1 | Product 2 |   4
Customer 1 | Product 3 |   7
Customer 2 | Product 1 |   2
Customer 2 | Product 2 |   5
Customer 2 | Product 3 |   8
Customer 3 | Product 1 |   3
Customer 3 | Product 2 |   6
Customer 3 | Product 3 |   9

我创建了一个函数来读取范围sheet1并将重新格式化的行附加在同一张纸的底部,但是我试图让它工作,这样我就可以使用该功能sheet2这将读取整个范围sheet1.

无论我尝试什么,我似乎都无法让它发挥作用,并且想知道是否有人可以给我任何指示?

这是我到目前为止所拥有的:

function readRows() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var rows = sheet.getDataRange();
  var numRows = rows.getNumRows();
  var values = rows.getValues();

  heads = values[0]
  
  for (var i = 1; i <= numRows - 1; i++) {
    for (var j = 1; j <= values[0].length - 1; j++) {
       var row = [values[i][0], values[0][j], values[i][j]];
       sheet.appendRow(row)
    }
  }
};

我写了一个简单的通用自定义函数,100%可复用您可以对任意大小的表格进行逆透视/反向透视。

在你的情况下,你可以这样使用它:=unpivot(A1:D4,1,1,"customer","sales")

因此,您可以像电子表格中的任何内置数组函数一样使用它。

请看这里2个例子:https://docs.google.com/spreadsheets/d/12TBoX2UI_Yu2MA2ZN3p9f-cZsySE4et1slwpgjZbSzw/edit#gid=422214765 https://docs.google.com/spreadsheets/d/12TBoX2UI_Yu2MA2ZN3p9f-cZsySE4et1slwpgjZbSzw/edit#gid=422214765

以下为来源:

/**
 * Unpivot a pivot table of any size.
 *
 * @param {A1:D30} data The pivot table.
 * @param {1} fixColumns Number of columns, after which pivoted values begin. Default 1.
 * @param {1} fixRows Number of rows (1 or 2), after which pivoted values begin. Default 1.
 * @param {"city"} titlePivot The title of horizontal pivot values. Default "column".
 * @param {"distance"[,...]} titleValue The title of pivot table values. Default "value".
 * @return The unpivoted table
 * @customfunction
 */
function unpivot(data,fixColumns,fixRows,titlePivot,titleValue) {  
  var fixColumns = fixColumns || 1; // how many columns are fixed
  var fixRows = fixRows || 1; // how many rows are fixed
  var titlePivot = titlePivot || 'column';
  var titleValue = titleValue || 'value';
  var ret=[],i,j,row,uniqueCols=1;

  // we handle only 2 dimension arrays
  if (!Array.isArray(data) || data.length < fixRows || !Array.isArray(data[0]) || data[0].length < fixColumns)
    throw new Error('no data');
  // we handle max 2 fixed rows
  if (fixRows > 2)
    throw new Error('max 2 fixed rows are allowed');

  // fill empty cells in the first row with value set last in previous columns (for 2 fixed rows)
  var tmp = '';
  for (j=0;j<data[0].length;j++)
    if (data[0][j] != '') 
      tmp = data[0][j];
    else
      data[0][j] = tmp;

  // for 2 fixed rows calculate unique column number
  if (fixRows == 2)
  {
    uniqueCols = 0;
    tmp = {};
    for (j=fixColumns;j<data[1].length;j++)
      if (typeof tmp[ data[1][j] ] == 'undefined')
      {
        tmp[ data[1][j] ] = 1;
        uniqueCols++;
      }
  }

  // return first row: fix column titles + pivoted values column title + values column title(s)
  row = [];
    for (j=0;j<fixColumns;j++) row.push(fixRows == 2 ? data[0][j]||data[1][j] : data[0][j]); // for 2 fixed rows we try to find the title in row 1 and row 2
    for (j=3;j<arguments.length;j++) row.push(arguments[j]);
  ret.push(row);

  // processing rows (skipping the fixed columns, then dedicating a new row for each pivoted value)
  for (i=fixRows; i<data.length && data[i].length > 0; i++)
  {
    // skip totally empty or only whitespace containing rows
    if (data[i].join('').replace(/\s+/g,'').length == 0 ) continue;

    // unpivot the row
    row = [];
    for (j=0;j<fixColumns && j<data[i].length;j++)
      row.push(data[i][j]);
    for (j=fixColumns;j<data[i].length;j+=uniqueCols)
      ret.push( 
        row.concat([data[0][j]]) // the first row title value
        .concat(data[i].slice(j,j+uniqueCols)) // pivoted values
      );
  }

  return ret;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Google 表格中创建“反向数据透视表”? 的相关文章

  • 如何读取FTL文件中的JSONArray?

    我在我的 Java 文件中硬编码了以下 JSON 对象 JSONObject notificationInfoJson new JSONObject notificationInfoJson put title Payment Receiv
  • Hapijs 在一个连接上同时使用 Http 和 Https

    New to Hapijs http hapijs com 并尝试使用它来创建一个应用程序 该应用程序对所有请求使用 HTTPS 并将 HTTP 重定向到安全连接 问题是应用程序进入 HTTPS 模式没有问题 但如果我将 URL 更改为 H
  • 如何设置 Swashbuckle 与 Microsoft.AspNetCore.Mvc.Versioning

    我们有asp net core webapi 我们添加了Microsoft AspNetCore Mvc Versioning and Swashbuckle拥有招摇的用户界面 我们将控制器指定为 ApiVersion 1 0 Route
  • Rails:统计用户未读通知的数量

    我目前有一个处理用户活动通知系统的活动模型 当发生某些操作 例如创建新文章 时 活动观察者会创建一个新活动 现在我想记录当前用户尚未看到的这些活动通知中有多少 类似于 facebook 上的通知宝石 每次用户单击通知链接时 数字应重置为 0
  • ftrace 是否允许捕获 Linux 内核的系统调用参数,或者仅捕获函数名称?

    目标是检查任何进程传递给特定系统调用 例如 exec open 等 的参数 来自官方文档 https www kernel org doc Documentation trace ftrace txt 没有描述记录函数参数的功能 主要查看
  • 如何制作饼图聚合数据源?

    Using 适用于 ASP NET MVC 的 Kendo UI 完整版 http www kendoui com 版本 2013 3 1119 2013年11月20日 如果我有这段代码 status chart kendoChart da
  • 在 url 中传递百分号 (%) 并使用 php 获取其准确值

    我正在尝试在 url 中传递百分号 例如 B6011000995504101 SB 但当我回声时 它又回来了 011000995504101 SB 我想要与在 URL 中传递的值完全相同的值 我尝试使用 urlencode 函数 但它给了我
  • 如何在不同的目录中执行python脚本?

    Solved对于可能觉得这有帮助的人 请参阅下面我的答案 我有两个脚本 a py 和 b py 在我当前的目录 C Users MyName Desktop MAIN 中 我运行 gt python a py 第一个脚本 a py 在我当前
  • 如何使用 jQuery 和“this”捕获更改的表单元素值

    我有以下代码 每当我的 Web 表单中发生元素更改时 该代码都会起作用 我一直在纠结的是如何捕捉表单字段元素 id name and 改变值当更改事件被触发时 谁能帮我解决这个问题吗 Thanks JavaScript
  • ES6解构对象赋值函数参数默认值

    您好 我正在查看在传递函数参数时使用对象解构的示例对象解构演示 https developer mozilla org en US docs Web JavaScript Reference Operators Destructuring
  • C# 中成员访问中的问号是什么意思?

    有人可以向我解释一下以下代码中会员访问中的问号是什么意思吗 它是标准 C 的一部分吗 尝试在 Xamarin Studio 中编译此文件时出现解析错误 this AnalyzerLoadFailed Invoke this new Anal
  • 在Python中使用os.makedirs创建目录时出现权限问题

    我只是想处理上传的文件并将其写入工作目录中 该目录的名称是系统时间戳 问题是我想以完全权限创建该目录 777 但我不能 使用以下代码创建的目录755权限 def handle uploaded file upfile cTimeStamp
  • Java编程编译jar

    我有一个文本文件中的java源代码 必须在源代码中输入一些自定义的硬编码变量 然后将其转换为 jar 这是可行的 但是当我运行 jar 时 找不到 Main 类 当我用 WinRAR 解压 jar 文件时 我似乎找不到错误 当我通过 cmd
  • Android 中用于过渡的自定义动画对象?

    我想用一些更奇特的东西来覆盖 Android 中的默认活动转换 我想做的事情不能用通常使用的 XML 集来完成 所以我不能使用overridePendingTransition因为它只接受对基于 XML 的动画资源的整数引用 我想做的是创建
  • dplyr::mutate 添加多个值

    网上有几个与此相关的问题dplyr Github 存储库 https github com hadley dplyr已经 并且至少有一个相关的问题 但没有一个问题完全涵盖了我的问题 我认为 在 dplyr mutate 调用中添加多列 ht
  • git jenkins 中未找到存储库

    我正在使用 jenkins 2 64 并安装了最新的插件 我试图在 jenkins 中设置 git 存储库并给出凭据 但给出错误无法连接存储库 状态代码为 128 Cloning repository https github com so
  • 如何使 Django 自定义管理命令参数不再需要?

    我正在尝试在 django 中编写自定义管理命令 如下所示 class Command BaseCommand def add arguments self parser parser add argument delay type int
  • 带有包含布局的导航抽屉布局

    我认为我的问题实际上很简单 但我不知道如何解决 有一个工作导航抽屉 代码如下
  • 相当于 JavaScript 中 Ruby 的each_cons

    许多语言都曾提出过这个问题 但 javascript 却没有 Ruby 有方法Enumerable each cons https devdocs io ruby 2 5 enumerable method i each cons看起来像这
  • 通过jquery ajax()和serialize()提交html表单

    我想通过 jquery ajax 提交此表单 这是我所做的 但它不起作用 即表单正在提交并刷新页面 但我没有看到响应 即在同一页面上打印数组 HTML

随机推荐

  • Ruby“.downcase!”和“downcase”混淆

    我刚刚开始 Ruby 编程 我读过小写和小写的区别 在红宝石中 https stackoverflow com questions 709229 difference between downcase and downcase in rub
  • 使用 dplyr mutate 将向量分成两列

    假设我有以下功能 get answer lt function condition dp rp if condition DD result lt rbinom n 2 size 1 prob dp if condition in c DR
  • 在 Android 中捕获完整的日志

    我想知道如何从 Android 设备获取完整日志 从我的应用程序初始化到任何崩溃或直到强制关闭我的应用程序 我在这里发帖的原因是我的应用程序在某个时候崩溃了 但是当我使用日志时DDMS Logcat我的崩溃详细信息已被新日志覆盖 我如何获取
  • 从堆栈内存中删除结构

    我有一个链表结构 我想将一个节点 另一个结构 指针传递给一个函数 该节点是链表的一部分 但我将节点单独传递给删除器函数 我希望它将下一个节点数据复制到自身中 覆盖其数据 并删除下一个节点 从而删除自身 这部分正在工作 我让它检查传递的节点是
  • @Html.BeginForm 在页面上显示“System.Web.Mvc.Html.MvcForm”

    我有一个剃刀视图 我在 if 语句内部添加了一个删除按钮 当视图在浏览器中呈现时 它会显示 系统 Web Mvc Html MvcForm 删除按钮旁边 我该如何摆脱它 这是代码 div if update User UserName Eq
  • processing.js 如何检测浏览器的大小?

    如前所述 processing js 如何响应浏览器的大小 响应式设计 我尝试过 screen width 和 screen height 但效果不佳 看来只能检测电脑屏幕尺寸的大小 更重要的是 我想在拖动并更改浏览器大小时与窗口大小保持同
  • C++数学表达式的错误结果[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我必须计算
  • 具有 MultiIndex 的 DataFrame 到 dict

    我有一个带有多重索引的数据框 我想知道我是否以正确的方式创建了数据框 见下文 01 01 02 01 03 01 04 01 bar total1 40 52 18 11 total2 36 85 5 92 baz total1 23 39
  • 如何在java中读取.pem文件格式的EC私钥

    如何使用JAVA读取 pem文件中的EC私钥 在阅读时我遇到以下异常 引起原因 java security InvalidKeyException IOException 版本不匹配 支持 00 解析 01 其实我的 Pem 文件包含以下结
  • 在 SQL 中使用 COUNT 函数

    首先也是最重要的 这是作业的一部分 我正在尝试使用 COUNT 函数作为与 Northwind 数据库相关的查询的一部分 查询应返回 CustomerID CompanyName 和为每个客户下的订单数量 当然 前两部分很简单 但我无法让
  • C++ 外部函数,以函数指针作为参数,在具有成员函数的类内部使用

    对 C 相当陌生 假设我有一堂课 class A private double m x m y public A double x double y m x x m y extF m x y intF double intF double
  • Json 文件到 pyspark 数据帧

    我正在尝试在 Spark pyspark 环境中使用 JSON 文件 问题 无法将 Pyspark Dataframe 中的 JSON 转换为预期格式 第一个输入数据集 https health data ny gov api views
  • 在 SELECT 中使用构造函数表达式的 JPQL/Hibernate 限制

    根据我对 JPA 2 0 规范的阅读 以下内容应该是有效的 select e employeeId new com foo Custom e employeeName e employeeCity from Employee e 然而 Hi
  • 带有 JSON 字符串的 IHttpActionResult

    我有一个方法最初返回一个HttpResponseMessage我想将其转换为返回IHttpActionResult 我的问题是当前的代码正在使用 JSON Net 来序列化复杂的通用树结构 它可以很好地使用自定义JsonConverter我
  • 使用 phpMyAdmin 将 CSV 文件导入 MySQL

    我搜索并阅读了许多关于使用以下命令将 CSV 文件导入 MySQL 数据库的帖子 文章phpMyAdmin 2 8 0 1他们让它听起来如此简单 但实际上并非如此 我所做的一切都没有正确 我有一个包含 2 列的表 均定义为NOT NULL
  • 为什么我不能直接将ArrayList添加到Jlist中?

    我正在尝试将 ArrayList 添加到 Jlist 但我给出的理解的唯一方法是编写如下代码 ArrayList
  • 错误消息“程序不包含适合入口点的静态‘Main’方法”

    我有一个 ASP NET CORE 应用程序 其中包含一些项目和以下 Dockerfile FROM microsoft dotnet 2 2 aspnetcore runtime AS base WORKDIR app EXPOSE 80
  • Polymer HTML 导入已弃用

    所以我刚刚开始使用聚合物并收到以下消息 Deprecation Styling master document from stylesheets defined in HTML Imports is deprecated and is pl
  • (MongoDB) 在同一管道中结合并集和交集

    我在最新版本的 mongoDB 和 pymongo 中运行以下聚合管道 project union setUnion query a query b unwind union group id union ID date a addToSe
  • 如何在 Google 表格中创建“反向数据透视表”?

    我正在尝试生成一个 反向枢轴 功能 我一直在努力寻找这样的功能 但找不到已经存在的功能 我有一个汇总表 其中最多有 20 列和数百行 但是我想将其转换为平面列表 以便我可以导入到数据库 甚至使用平面数据来创建更多数据透视表 所以 我有这种格