基于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
相关产品推荐
相关产品推荐

