我在我的谷歌作業表應用程式腳本上有這個代碼,它應該做一個“只要作業表中有新的資料行,就為單元格提供一個具有設定默認值的條件”:
function onSelectionChange(e) {
var row = e.range.getRow();
var cellAbove = e.range.getRow()-1;
var upperCell = e.source.getActiveSheet().getRange(cellAbove,4).getValue();
if (upperCell === "Chris"){
e.source.getActiveSheet().getRange(row,4).setValue("Genki");
GmailApp.sendEmail("[email protected]", "form submit", "Message for Genki");
} else {
e.source.getActiveSheet().getRange(row,4).setValue("Chris");
GmailApp.sendEmail("[email protected]", "form submit", "Message for Chris");
}
}
我把觸發器設定“on Change”。問題是,我的功能在觸發器上不起作用。我的條件是表單正在運行,并且我有一個表單,每當有人在我的網站上輸入表單時,它都會在我的 google 表單上添加新資料(使用另一個腳本)。新資料將是前 3 列:時間戳、姓名和電子郵件。而代理列將自動填充我的腳本。盡管觸發器“更改時”不起作用,但當我使用“編輯時”更改觸發器并在任何單元格上鍵入新資料時,腳本正在作業。我想要實作的是每當創建新的資料行時,將根據條件填充“代理”列。
我的床單
有什么解決辦法嗎?任何幫助表示贊賞。謝謝你。
------------------------ 更新:這是我的完整腳本:
var sheetName = 'Sheet1'
var scriptProp = PropertiesService.getScriptProperties()
function intialSetup () {
var activeSpreadsheet = SpreadsheetApp.getActiveSpreadsheet()
scriptProp.setProperty('key', activeSpreadsheet.getId())
}
function doPost (e) {
var lock = LockService.getScriptLock()
lock.tryLock(10000)
try {
var doc = SpreadsheetApp.openById(scriptProp.getProperty('key'))
var sheet = doc.getSheetByName(sheetName)
var headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0]
var nextRow = sheet.getLastRow() 1
var newRow = headers.map(function(header) {
return header === 'timestamp' ? new Date() : e.parameter[header]
})
sheet.getRange(nextRow, 1, 1, newRow.length).setValues([newRow])
return ContentService
.createTextOutput(JSON.stringify({ 'result': 'success', 'row': nextRow }))
.setMimeType(ContentService.MimeType.JSON)
}
catch (e) {
return ContentService
.createTextOutput(JSON.stringify({ 'result': 'error', 'error': e }))
.setMimeType(ContentService.MimeType.JSON)
}
finally {
lock.releaseLock()
}
}
function onSelectionChange(e) {
var row = e.range.getRow();
var cellAbove = e.range.getRow()-1;
var upperCell = e.source.getActiveSheet().getRange(cellAbove,4).getValue();
if (upperCell === "Chris"){
e.source.getActiveSheet().getRange(row,4).setValue("Genki");
//GmailApp.sendEmail("my_email", "subject", "message");
} else {
e.source.getActiveSheet().getRange(row,4).setValue("Chris");
//GmailApp.sendEmail("another_mail", "subject", "message");
}
}
uj5u.com熱心網友回復:
我相信你的目標如下。
- 添加新行時,您希望使用
upperCell === "Chris".
在這種情況下,如何修改您的doPost函式如下?
修改后的腳本:
從:
var newRow = headers.map(function(header) {
return header === 'timestamp' ? new Date() : e.parameter[header]
})
sheet.getRange(nextRow, 1, 1, newRow.length).setValues([newRow])
到:
var newRow = headers.map(function (header) {
return header === 'timestamp' ? new Date() : e.parameter[header]
})
var upperCell = sheet.getRange(nextRow - 1, 4).getValue();
if (upperCell === "Chris") {
newRow[3] = "Genki";
//GmailApp.sendEmail("my_email", "subject", "message"); // You will use this line?
} else {
newRow[3] = "Chris";
//GmailApp.sendEmail("another_mail", "subject", "message"); // You will use this line?
}
sheet.getRange(nextRow, 1, 1, newRow.length).setValues([newRow]);
- 在這個修改中,
doPost運行時,檢查當前作業表的最后一行。這樣,陣列的newRow更新。 - 而且,在這種情況下,您
onSelectionChange不需要使用。
筆記:
- 當您修改 Google Apps 腳本時,請將部署修改為新版本。這樣,修改后的腳本就會反映在 Web Apps 中。請注意這一點。
- 您可以在“重新部署 Web 應用程式而不更改新 IDE 的 Web 應用程式的 URL ”的報告中看到這方面的詳細資訊。
- 我建議的腳本是一個簡單的腳本。所以請根據您的實際情況進行修改。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/358813.html
