我在使用 Google Apps 腳本自動執行某些產品提要操作(決議 XML、添加補充資料、轉換為不同格式:TSV、CSV、XML)等時遇到了問題。
當我直接運行腳本時,它 100% 的時間都有效,我在使用它的 6 個多月中沒有遇到錯誤。但是,在每天凌晨 1 點到凌晨 5 點 CEE 時間之間設定自動時間觸發器時,由于超時而導致的失敗百分比幾乎是 50%(我知道間隔是 1 小時,但是在這個計劃中安排的多個腳本會發生這種情況間隔)。
我查看了腳本,到目前為止還沒有真正找到任何解決方案,也沒有發現任何其他類似的問題。
值得一提的是:
- 該專案鏈接到谷歌云專案,因此執行時間為 30 分鐘。
- XML 源是一個電子表格,大約有 16K 行和列,直到 AA(27 列)
- 源電子表格內容來自 IMPORTRANGE(該架構是一個巨大的提要,其中包含所有需要的列和許多帶有有意義列和自定義列名稱的 IMPORTRANGES 的小型提要)。從這一點開始,如果需要,我運行一個用于 XML 匯出的腳本,因為 Google 云端硬碟不支持直接 XML 轉換。此 XML 轉換腳本失敗。
- 該腳本不會拋出錯誤,只會在 1800 秒后超時。
我考慮過不使用 XML 服務并使用一些字串連接來構建 XML 字串,這應該會加快速度,但是我遇到了一個腳本問題,該腳本還決議了初始 XML 并且使用正則運算式進行決議可能會變得非常復雜,我'我寧愿從效率的角度理解我在這里做錯了什么。
我有一些編碼經驗,但對現代 JS 的經驗不多,對 Google Apps Script 的經驗也不多,因此,任何提示/有意義的文章都值得贊賞。
轉換為 XML 腳本(有問題的腳本之一)
`
function main(){
const ID = "";
var data = SpreadsheetApp.openById(ID).getDataRange().getValues();
var headers = [];
var root = XmlService.createElement('shop');
for (var j = 0; j < data.length; j ){
if(j == 0){
headers = data[j];
continue;
}
if(data[j][0] != ""){
var row = XmlService.createElement('shopitem')
for(var k = 0; k < data[0].length; k ){
if(headers[k].startsWith("P_")){
var vbl = XmlService.createElement("PARAM");
vbl.addContent(XmlService.createElement("PARAM_NAME").setText(headers[k].replace("P_", "")));
vbl.addContent(XmlService.createElement("PARAM_VAL").setText(data[j][k]));
}else{
var col = headers[k];
var type = data[j][k].constructor.name;
if(data[j][k].constructor.name == 'Date'){
var vbl = XmlService.createElement(col).setText(data[j][k].toISOString().slice(0, 10));
}else{
var vbl = XmlService.createElement(col).setText(data[j][k])
}
}
row.addContent(vbl)
}
root.addContent(row)
}
}
var document = XmlService.createDocument(root);
var xml = XmlService.getPrettyFormat().format(document);
overwriteFile(new Utilities.newBlob(xml), "file-id")
}
function overwriteFile(blobOfNewContent,currentFileID) {
var currentFile;
currentFile = DriveApp.getFileById(currentFileID);
if (currentFile) {//If there is a truthy value for the current file
Drive.Files.update({
title: currentFile.getName(), mimeType: currentFile.getMimeType()
}, currentFile.getId(), blobOfNewContent);
}
}
`
問題:
- 為什么控制臺運行每次都有效,但時間觸發卻不行?
- 可以做些什么來優化它?
謝謝你們!
我試圖在 Drive 中將檔案創建為新檔案而不是替換其內容,但這并沒有導致錯誤率的改善,所以我認為問題出在對 XMLService API 的呼叫上,但我'我不確定“繞過它/不使用它”是否是解決方案。
我研究了批量 XML 決議以避免在 for 回圈內使用 api 呼叫,但找不到任何東西。
我的下一個選擇是使用正則運算式/連接規則將 XML 構造/決議為字串,但這感覺像是一個不太專業的替代方案,我不確定它是否能解決問題,因為我沒能解決診斷原因。
uj5u.com熱心網友回復:
如果兩次處理的資料量相同,我想不出在通過時間驅動觸發器運行時運行時執行時間更長的原因(也找不到記錄的原因)。
但是,以下幾點可能有助于優化運行時性能:
- 如果從源電子表格中獲取的資料很大,您可能希望拆分范圍值并一次處理每個“范圍區域”。
- 盡管表格和 Apps 腳本可以處理大量資料,但這些都不是為它構建或推薦的解決方案。您可能需要考慮使用適當的資料庫或其他 Google 解決方案(例如BigQuery或Firebase 的 Firestore)
- 以編程方式創建另一個定時觸發器以在一定時間后完成執行。
- 或者,您可以使用此模板向 Google 報告此行為。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/537630.html
上一篇:SQL連接多列或單個計算列
