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

基于CB_DeviceDetails的Chromebook Apps Script功能优化求助

问题:Chromebook设备管理工具的OU迁移与资产ID同步问题

核心需求

  • 在pageSerial.html第47行,替换原有OU静态显示为加载所有Google Workspace OU的下拉框,支持选中后将设备迁移至目标OU
  • 将资产ID改为可编辑文本框,修改后同步更新至Google Admin端的设备信息

已完成的开发尝试

1. 资产ID文本框改造

已将静态显示改为文本框,但无法同步到Google端:

<td>Asset ID</td>
<td><input type="text" style="border:solid;" name="AssetID" value="idCBassets" id="idCBassets"></td>

2. OU相关功能开发

  • 成功获取所有OU的函数:
var ouArray = [];
var page = AdminDirectory.Orgunits.list('my_customer', {
  orgUnitPath: '/',
  type: 'all'
});
var orgUnits = page.organizationUnits;
if (orgUnits) {
  for (var i = 0; i < orgUnits.length; i++) {
    var orgUnit = orgUnits[i];
    ouArray.push(orgUnit.orgUnitPath);
  }
  ouArray.sort();
} else {
  var ouname2 = 'No OUs found.';
  var ou2 = 'No OUs found.';
}
  • 成功将OU列表渲染到页面下拉框:
var listOUs = CBOU[15]; 
console.log(listOUs);
let htmlT=`<select id="idOUs">`; 
for (let i=0; i<listOUs.length; i++) {
  const optionT = listOUs[i].replace(/<|>/g,'');
  htmlT+=`<option ${optionT==CBOU[6]?`selected`:``} value="${optionT}">${optionT}</option>`;
}
htmlT+='</select>'
console.log(htmlT);

document.getElementById("selectinput").innerHTML = htmlT;
var elems = document.querySelectorAll('select');
var instances = M.FormSelect.init(elems);
  • 尝试了设备迁移函数,但未与页面操作对接成功:
function moveCB(sernum) {
  var serno = sernum;
  var sernoquery = "id:" + serno;
  var chromebooklist = AdminDirectory.Chromeosdevices.list('my_customer', { query: sernoquery }).chromeosdevices;
  if (!chromebooklist) {
  } else if (chromebooklist.length !== 1) {
  } else {
    var id = chromebooklist[0].deviceId;
    try {
      AdminDirectory.Chromeosdevices.update({ orgUnitPath: ou }, 'my_customer', id);
    } catch (err) {
      return [serno, "couldn't be moved", "#ffc90e"];
    }
  }
  return [serno, "has been moved, clear requested", "#ba68c8"];
}

待解决问题

  • 资产ID修改后无法同步更新到Google Admin的设备信息
  • OU下拉框选择目标OU后,点击更新按钮无法触发设备迁移操作

解决方案

1. 资产ID同步实现

前端修正

将文本框的硬编码值改为动态绑定当前设备的资产ID:

<td>Asset ID</td>
<td><input type="text" style="border:solid;" name="AssetID" value="${currentDeviceAssetId}" id="idCBassets"></td>

后端更新函数

添加支持资产ID更新的函数:

function updateDeviceAssetId(deviceId, newAssetId) {
  try {
    AdminDirectory.Chromeosdevices.update(
      { annotatedAssetId: newAssetId },
      'my_customer',
      deviceId
    );
    return { success: true, message: "资产ID更新成功" };
  } catch (err) {
    return { success: false, message: "更新失败:" + err.message };
  }
}

前端提交逻辑

为更新按钮绑定点击事件,获取文本框值并调用后端接口:

document.getElementById("updateBtn").addEventListener("click", function() {
  const assetId = document.getElementById("idCBassets").value.trim();
  const deviceSerial = /* 从页面现有数据中获取当前设备序列号 */;
  
  const sernoquery = "id:" + deviceSerial;
  const chromebooklist = AdminDirectory.Chromeosdevices.list('my_customer', { query: sernoquery }).chromeosdevices;
  
  if (chromebooklist && chromebooklist.length === 1) {
    const deviceId = chromebooklist[0].deviceId;
    google.script.run.withSuccessHandler(function(res) {
      alert(res.message);
    }).updateDeviceAssetId(deviceId, assetId);
  }
});

2. OU迁移功能实现

绑定更新按钮的迁移逻辑

整合资产ID更新与OU迁移的点击事件:

document.getElementById("updateBtn").addEventListener("click", function() {
  const deviceSerial = /* 从页面现有数据中获取当前设备序列号 */;
  const sernoquery = "id:" + deviceSerial;
  const chromebooklist = AdminDirectory.Chromeosdevices.list('my_customer', { query: sernoquery }).chromeosdevices;
  
  if (!chromebooklist || chromebooklist.length !== 1) {
    alert("未找到对应设备");
    return;
  }
  
  const deviceId = chromebooklist[0].deviceId;
  const updateData = {};
  
  // 处理资产ID更新
  const assetId = document.getElementById("idCBassets").value.trim();
  if (assetId) {
    updateData.annotatedAssetId = assetId;
  }
  
  // 处理OU迁移
  const selectedOu = document.getElementById("idOUs").value;
  if (selectedOu) {
    updateData.orgUnitPath = selectedOu;
  }
  
  // 调用统一更新接口
  google.script.run.withSuccessHandler(function(res) {
    alert(res.message);
    // 可选:刷新页面数据
  }).updateDevice(deviceId, updateData);
});

后端统一更新函数

合并资产ID与OU的更新逻辑:

function updateDevice(deviceId, updateData) {
  try {
    AdminDirectory.Chromeosdevices.update(
      updateData,
      'my_customer',
      deviceId
    );
    return { success: true, message: "设备信息更新成功" };
  } catch (err) {
    return { success: false, message: "更新失败:" + err.message };
  }
}

关键注意事项

  • 确保已在Google Apps Script编辑器的「高级Google服务」中启用Admin Directory API
  • 运行脚本的账号需拥有Google Workspace的设备管理权限
  • 前端获取设备序列号的逻辑需与页面现有数据源(如CBOU数组)匹配

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 05:48:00