Google Sheet - Json fed 数据表的正确格式和命令
proper format and commands for Google Sheet - Json fed Datatables
试图直接从 Google Sheet 向 Datatables table 提供一组 json 数据 我一开始就遇到了这种错误:
DataTables warning: table id=example - Requested unknown parameter 'name' for row 0, column 0. For more information about this error, please see http://datatables.net/tn/4
这是我的 json 与提供的 in their example 的对比,当然格式不同
{
"range": "json!A1:Y1000",
"majorDimension": "ROWS",
"values": [
[
"name",
"position",
"salary",
"start_date",
"office",
"extn"
],
[
"Unity Butler",
"prova",
",675",
"2009/12/09",
"San Francisco",
"5384"
]
]
}
{
"data": [
{
"id": "1",
"name": "Tiger Nixon",
"position": "System Architect",
"salary": "0,800",
"start_date": "2011/04/25",
"office": "Edinburgh",
"extn": "5421"
},
{
"id": "2",
"name": "Garrett Winters",
"position": "Accountant",
"salary": "0,750",
"start_date": "2011/07/25",
"office": "Tokyo",
"extn": "8422"
},
{...}
]
}
我知道不同的格式需要不同的处理方式,我很想知道如何处理。我接受的@andrewjames 提供的答案解释了不同格式的性质以及如何处理它们。
基本上只需要 从 ajax option, as you can see from this jsfiddle 中删除“列”参数,您可以在其中找到完整的工作代码(以及库)。
更新:补充任务
现在,假设您想将一些额外的信息安排到一组 toggle hide-show child rows。
只要数据格式尊重示例提供的原始格式,我就可以轻松做到这一点:我什至可以通过 .php 文件从 mysql 数据库中获取数据并进行排列进入json!
jsfiddle
<?php
$con=mysqli_connect("","","","");
// Check connection
if (mysqli_connect_errno())
{
echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
$out = array();
if ($result = mysqli_query($con, "SELECT * FROM your_table")) {
$out = $result->fetch_all(MYSQLI_ASSOC);
}
echo "{ \"data\": ", json_encode( $out ), "}";
mysqli_close($con);
?>
当我尝试从常用的 GSheet-fed json 数组中提取数据时,问题开始了:我如何结合子行切换功能和 GSheet 通常格式化 json 文件 ?
您从 DataTables 示例中显示的 JSON 数据是 objects:
的数组
[ {...}, {...}, ... ]
您创建的JSON数据是一个数组数组:
[ [...], [...], ... ]
DataTables 可以使用这两种结构作为其数据源 - 但它必须以不同的方式使用..
对于 object 的数组,每个 object 代表您的 DataTables 数据的一个(潜在)行 - 行中的每个值都由一个名称和一个值组成 - 例如:
"salary": "0,800"
这就是 DataTable 使用这样的列定义的原因:
{ "data": "salary" }
这意味着:对于该单元格的数据,使用名称为“salary”的值。
但在您的情况下没有名称 - 只有值:
",675"
因此,您不能使用 { "data": "salary" }
,因为您的 JSON 中不存在该名称(“salary”)。
此外,您的结构在其第一个数组中包含列标题和行数据:
[
"name",
"position",
"salary",
"start_date",
"office",
"extn"
],
要解决这些差异,您有 2 个基本选项:
Re-arrange 你的 JSON 所以它匹配“objects 的数组”结构。
查看基于数组数组的相关 DataTables 示例之一 - 例如 Ajax data source (arrays).
选项 (2) 更简单 - 更接近您的起点。
但无论哪种情况,您仍然需要处理列标题,因为它们与列 body 行分开,需要单独定义。
目前,您的第一行(看起来像列标题)最终会显示为第一行数据 - 这不是您想要的。
一种方法是定义您的 <html>
table 以包含标题 (hard-coded):
<table id="example" class="display" style="width:100%">
<thead>
<tr>
<th>Name</th>
<th>Position</th>
<th>Office</th>
<th>Extn.</th>
<th>Start date</th>
<th>Salary</th>
</tr>
</thead>
</table>
或者,您可以使用这个:
<table id="example" class="display" style="width:100%">
</table>
并在 Datatable 定义中定义您的列标题,使用 DataTables title
关键字:
<script>
$(document).ready(function() {
$('#example').DataTable( {
columns: [
{ title: "Name" },
{ title: "Position" },
{ title: "Office" },
{ title: "Extn." },
{ title: "Start date" },
{ title: "Salary" }
]
} );
} );
</script>
当您这样做时,您需要从 JSON:
中删除 标题数组
{
"range": "json!A1:Y1000",
"majorDimension": "ROWS",
"values": [
[
"Unity Butler",
"prova",
",675",
"2009/12/09",
"San Francisco",
"5384"
],
[
// more array data here...
], ...
]
}
现在对于数组的数组,无需为每一列指定 data
值。因为每一行都是一个普通数组,DataTables 自动将第一个值放在行的第一个单元格中,第二个值放在第二个单元格中,依此类推...
最后说明:在您的示例中,您使用了这个:
dataSrc: 'values' // values instead of data in this case
这很好。它告诉 DataTables 在名为 values
.
的 top-level 字段中查找您的数组
更新
对于 child 行示例,如果您停止使用数组的数组并开始使用 object 的数组,您将有更轻松的时间。这样你就可以使用 object names 明确选择哪些 values 属于 parent 行,哪些属于child 行。
因此,如果您在 sheet 中有源数据,标题为:
heading_1
heading_2
heading_3
value 1
value 2
value 3
value 4
value 5
value 6
然后你需要从这个结构中转换数据:
[
[ "value 1", "value 2", "value 3" ],
[ "value 4", "value 5", "value 6" ]
]
{ "data": [
{ "heading_1": "value 1", "heading_2": "value 2", "heading_3": "value 3" },
{ "heading_1": "value 4", "heading_2": "value 5", "heading_3": "value 6" }
] }
JavaScript可以做到这一点。也许你可以自己试试?如果您遇到困难,可以提出具体问题。
一旦你有了 object 的数组,你就可以更容易地跟随 example。现在您可以选择在 parent 行中使用哪个字段 names 以及在 child 行中使用哪个字段。
试图直接从 Google Sheet 向 Datatables table 提供一组 json 数据 我一开始就遇到了这种错误:
DataTables warning: table id=example - Requested unknown parameter 'name' for row 0, column 0. For more information about this error, please see http://datatables.net/tn/4
这是我的 json 与提供的 in their example 的对比,当然格式不同
{
"range": "json!A1:Y1000",
"majorDimension": "ROWS",
"values": [
[
"name",
"position",
"salary",
"start_date",
"office",
"extn"
],
[
"Unity Butler",
"prova",
",675",
"2009/12/09",
"San Francisco",
"5384"
]
]
}
{
"data": [
{
"id": "1",
"name": "Tiger Nixon",
"position": "System Architect",
"salary": "0,800",
"start_date": "2011/04/25",
"office": "Edinburgh",
"extn": "5421"
},
{
"id": "2",
"name": "Garrett Winters",
"position": "Accountant",
"salary": "0,750",
"start_date": "2011/07/25",
"office": "Tokyo",
"extn": "8422"
},
{...}
]
}
我知道不同的格式需要不同的处理方式,我很想知道如何处理。我接受的@andrewjames 提供的答案解释了不同格式的性质以及如何处理它们。
基本上只需要 从 ajax option, as you can see from this jsfiddle 中删除“列”参数,您可以在其中找到完整的工作代码(以及库)。
更新:补充任务
现在,假设您想将一些额外的信息安排到一组 toggle hide-show child rows。
只要数据格式尊重示例提供的原始格式,我就可以轻松做到这一点:我什至可以通过 .php 文件从 mysql 数据库中获取数据并进行排列进入json! jsfiddle
<?php
$con=mysqli_connect("","","","");
// Check connection
if (mysqli_connect_errno())
{
echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
$out = array();
if ($result = mysqli_query($con, "SELECT * FROM your_table")) {
$out = $result->fetch_all(MYSQLI_ASSOC);
}
echo "{ \"data\": ", json_encode( $out ), "}";
mysqli_close($con);
?>
当我尝试从常用的 GSheet-fed json 数组中提取数据时,问题开始了:我如何结合子行切换功能和 GSheet 通常格式化 json 文件 ?
您从 DataTables 示例中显示的 JSON 数据是 objects:
的数组[ {...}, {...}, ... ]
您创建的JSON数据是一个数组数组:
[ [...], [...], ... ]
DataTables 可以使用这两种结构作为其数据源 - 但它必须以不同的方式使用..
对于 object 的数组,每个 object 代表您的 DataTables 数据的一个(潜在)行 - 行中的每个值都由一个名称和一个值组成 - 例如:
"salary": "0,800"
这就是 DataTable 使用这样的列定义的原因:
{ "data": "salary" }
这意味着:对于该单元格的数据,使用名称为“salary”的值。
但在您的情况下没有名称 - 只有值:
",675"
因此,您不能使用 { "data": "salary" }
,因为您的 JSON 中不存在该名称(“salary”)。
此外,您的结构在其第一个数组中包含列标题和行数据:
[
"name",
"position",
"salary",
"start_date",
"office",
"extn"
],
要解决这些差异,您有 2 个基本选项:
Re-arrange 你的 JSON 所以它匹配“objects 的数组”结构。
查看基于数组数组的相关 DataTables 示例之一 - 例如 Ajax data source (arrays).
选项 (2) 更简单 - 更接近您的起点。
但无论哪种情况,您仍然需要处理列标题,因为它们与列 body 行分开,需要单独定义。
目前,您的第一行(看起来像列标题)最终会显示为第一行数据 - 这不是您想要的。
一种方法是定义您的 <html>
table 以包含标题 (hard-coded):
<table id="example" class="display" style="width:100%">
<thead>
<tr>
<th>Name</th>
<th>Position</th>
<th>Office</th>
<th>Extn.</th>
<th>Start date</th>
<th>Salary</th>
</tr>
</thead>
</table>
或者,您可以使用这个:
<table id="example" class="display" style="width:100%">
</table>
并在 Datatable 定义中定义您的列标题,使用 DataTables title
关键字:
<script>
$(document).ready(function() {
$('#example').DataTable( {
columns: [
{ title: "Name" },
{ title: "Position" },
{ title: "Office" },
{ title: "Extn." },
{ title: "Start date" },
{ title: "Salary" }
]
} );
} );
</script>
当您这样做时,您需要从 JSON:
中删除 标题数组{
"range": "json!A1:Y1000",
"majorDimension": "ROWS",
"values": [
[
"Unity Butler",
"prova",
",675",
"2009/12/09",
"San Francisco",
"5384"
],
[
// more array data here...
], ...
]
}
现在对于数组的数组,无需为每一列指定 data
值。因为每一行都是一个普通数组,DataTables 自动将第一个值放在行的第一个单元格中,第二个值放在第二个单元格中,依此类推...
最后说明:在您的示例中,您使用了这个:
dataSrc: 'values' // values instead of data in this case
这很好。它告诉 DataTables 在名为 values
.
更新
对于 child 行示例,如果您停止使用数组的数组并开始使用 object 的数组,您将有更轻松的时间。这样你就可以使用 object names 明确选择哪些 values 属于 parent 行,哪些属于child 行。
因此,如果您在 sheet 中有源数据,标题为:
heading_1 | heading_2 | heading_3 |
---|---|---|
value 1 | value 2 | value 3 |
value 4 | value 5 | value 6 |
然后你需要从这个结构中转换数据:
[
[ "value 1", "value 2", "value 3" ],
[ "value 4", "value 5", "value 6" ]
]
{ "data": [
{ "heading_1": "value 1", "heading_2": "value 2", "heading_3": "value 3" },
{ "heading_1": "value 4", "heading_2": "value 5", "heading_3": "value 6" }
] }
JavaScript可以做到这一点。也许你可以自己试试?如果您遇到困难,可以提出具体问题。
一旦你有了 object 的数组,你就可以更容易地跟随 example。现在您可以选择在 parent 行中使用哪个字段 names 以及在 child 行中使用哪个字段。