You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Google Web应用中jQuery DataTables显示“No Data Available in Table”且无法过滤数据的解决方法

解决DataTables加载异步数据后无法过滤且提示"No Data Available"的问题

这个问题的核心原因是DataTables初始化的时机不对:你在DOM加载完成后就立刻初始化了DataTables,但此时表格tbody里还没有任何数据;之后通过google.script.run异步拉取数据并手动插入DOM的操作,DataTables完全没有感知到,所以它依然认为表格是空的,导致过滤功能失效并显示"No Data Available"。

下面提供两种可靠的解决方法:


方法一:先加载数据,再初始化DataTables

调整代码执行顺序,先完成数据的拉取和DOM渲染,再初始化DataTables,这样DataTables初始化时就能检测到所有行数据。

修改后的03_datatables.html脚本部分:

<script>
// 先拉取数据,再初始化DataTables
document.addEventListener('DOMContentLoaded', function() {
  google.script.run.withSuccessHandler(function(dataArray) {
    generateTable(dataArray);
    // 数据渲染完成后,初始化DataTables
    initDataTable();
  }).getTableData();
});

function generateTable(dataArray) {
  var tbody = document.getElementById("table-body");
  dataArray.forEach(function(r){
    var row = document.createElement("tr");
    for(i=0; i<6; i++) {
      var col = document.createElement("td");
      col.textContent = r[i];
      row.appendChild(col);
    }
    tbody.appendChild(row);
  });
}

function initDataTable() {
  // Setup - add a text input to each footer cell
  $('#example tfoot th').each( function () {
    var title = $(this).text();
    $(this).html( '<input type="text" placeholder="Search '+title+'" />' );
  } );

  // DataTable初始化
  var table = $('#example').DataTable({
    initComplete: function () {
      // Apply the search
      this.api().columns().every( function () {
        var that = this;

        $( 'input', this.footer() ).on( 'keyup change clear', function () {
          if ( that.search() !== this.value ) {
            that
              .search( this.value )
              .draw();
          }
        } );
      } );
    }
  });
}
</script>

方法二:使用DataTables API添加数据(更推荐)

跳过手动操作DOM的步骤,直接用DataTables的row.add() API来添加数据,这样DataTables会自动维护数据状态,原生支持过滤、排序等功能。

修改后的03_datatables.html脚本部分:

<script>
$(document).ready(function() {
  // 先初始化空的DataTables
  var table = $('#example').DataTable({
    initComplete: function () {
      // Setup - add a text input to each footer cell
      $('#example tfoot th').each( function () {
        var title = $(this).text();
        $(this).html( '<input type="text" placeholder="Search '+title+'" />' );
      } );

      // Apply the search
      this.api().columns().every( function () {
        var that = this;

        $( 'input', this.footer() ).on( 'keyup change clear', function () {
          if ( that.search() !== this.value ) {
            that
              .search( this.value )
              .draw();
          }
        } );
      } );
    }
  });

  // 拉取数据并通过DataTables API添加
  google.script.run.withSuccessHandler(function(dataArray) {
    dataArray.forEach(function(r){
      // 用row.add添加行数据,然后draw()更新表格
      table.row.add(r).draw(false);
    });
  }).getTableData();
});
</script>

为什么推荐方法二?

  • DataTables会自动管理数据,不需要手动操作DOM,减少出错概率
  • 原生支持所有DataTables的功能(过滤、排序、分页等),不需要额外处理
  • 代码更简洁,逻辑更清晰

内容的提问来源于stack exchange,提问作者Rheago

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 12:12:45