我正在使用 Google 腳本編寫我的第一個程式碼。我的程式碼遇到問題,它沒有存取 Google 試算表所需的權限。嘗試執行程式碼時,我收到錯誤訊息「異常:您無權呼叫 SpreadsheetApp.openById」。該程式碼旨在修改和檢索 Google 試算表電子表格中的資料。
除了權限問題之外,程式碼中還有一個特定行為需要解決。該程式碼旨在將資訊傳輸到 Google Sheets 電子表格中的特定行,但目前正在將資料傳輸到電子表格之外的位置。例如,如果電子表格中第 9 行有可用的空白空間,則程式碼會錯誤地將資訊傳送到表外沒有格式或結構的其他位置。我在下面附上了我的程式碼
function onEdit(e) { var sourceSheet = e.source.getActiveSheet(); var editedRange = e.range; var column = editedRange.getColumn(); var row = editedRange.getRow(); if (column > 1 && row > 1) { var technicianNameCell = sourceSheet.getRange(row, 13); var technicianName = technicianNameCell.getValue(); var dataValues = []; var columnsToCopy = [1, 2, 3, 4, 5, 6, 7, 11, 12]; // A, B, C, D, E, F, G, J for (var i = 0; i < columnsToCopy.length; i++) { var value = sourceSheet.getRange(row, columnsToCopy[i]).getValue(); dataValues.push(value); } var targetSpreadsheetIds = { "technicianName": { "spreadsheetId": "spreadsheetId", "sheetName": "sheetName" }, "technicianName": { "spreadsheetId": "spreadsheetId", "sheetName": "sheetName" }, "technicianName": { "spreadsheetId": "spreadsheetId", "sheetName": "sheetName" } }; var targetSpreadsheet = targetSpreadsheetIds[technicianName]; if (targetSpreadsheet) { var targetSheet = SpreadsheetApp.openById(targetSpreadsheet.spreadsheetId).getSheetByName(targetSpreadsheet.sheetName); var lastRow = targetSheet.getLastRow(); var firstEmptyRow = lastRow + 1; var targetRange = targetSheet.getRange(firstEmptyRow, 1, 1, dataValues.length); targetRange.setValues([dataValues]); } } }
我嘗試實作一個程式碼來修改和檢索 Google 試算表電子表格中的資料。我希望程式碼具有存取電子表格並執行所需操作的必要權限。具體來說,我希望程式碼能夠使用傳輸的資訊填充電子表格中的空白空間,同時保留表格的格式和結構。
然而,實際的結果是程式碼遇到了權限問題。執行程式碼時出現「Exception: You do not have permission to call SpreadsheetApp.openById」錯誤。此外,傳輸的資訊被放置在表格之外的位置,沒有格式或結構。
Google 表格程式碼中的資料放置
好吧,事情就這樣了。我正在使用的程式碼非常擅長尋找表中的空白點。唯一的問題是,它最終將數據放在我擁有的實際表之外。您看,程式碼認為表中的格式是完整的行,因此它沒有將資料準確地放置在我希望的行中的位置。在此輸入圖像描述
我現在擁有的程式碼
function myEditTrigger(e) { const sh = e.range.getSheet(); if (sh.getName() == "Sheet Name" && e.range.columnStart > 1 && e.range.rowStart > 1) { const [a, b, c, d, e, f, g, , , k, l, m] = sh.getRange(e.range.rowStart, 1, 1, sh.getLastColumn()).getValues()[0]; let vs = [a, b, c, d, e, f, g, k, l]; var tObjs = { "techname": { "spreadsheetId": "spreadsheetId", "sheetName": "sheetName" }, }; var tObj = tObjs[m]; if (tObj) { var tsh = SpreadsheetApp.openById(tObj.spreadsheetId).getSheetByName(tObj.sheetName); tsh.getRange(tsh.getLastRow() + 1, 1, 1, vs.length).setValues([vs]); } } }
P粉5216974192024-04-04 00:36:31
使用可安裝的觸發器並重新命名觸發器函數,不要使用onEdit
#function onMyEdit(e) { const sh = e.range.getSheet(); if (sh.getName() == "Sheet Name" && e.range.columnStart > 1 && e.range.rowStart > 1) { const [a,b,c,d,e,f,g,,,,k,l,m] = sh.getRange(e.range.rowStart, 1 , 1, sh.getLastColumn()).getValues()[0]; let vs = [a,b,c,d,e,f,g,k,l]; var tObjs = {"technicianName": {"spreadsheetId": "spreadsheetId","sheetName": "sheetName" },...};//Hard code the objs or make them global var tObj = tObjs[m]; if (tObj) { var tsh = SpreadsheetApp.openById(tObj.spreadsheetId).getSheetByName(tObj.sheetName); tsh.getRange(tsh.getLastRow() + 1, 1, 1, vs.length).setValues(vs); } } }