ฟังก์ชั่นพร้อมพารามิเตอร์สำหรับ addItem ในเมนูสเปรดชีตโดยใช้สคริปต์แอป

ฉันต้องการในแต่ละสเปรดชีตที่เปิดอยู่เพื่อตรวจสอบแผ่นงานที่มีอยู่ในสเปรดชีตและสร้างรายการเสริมที่ไปที่แผ่นงานเฉพาะผ่านการคลิกในรายการรายการ

จำนวนแผ่นงานจะมีขนาดใหญ่และเพิ่มเข้ามาแบบไดนามิกผ่านการทำงาน

ขณะนี้ฉันกำลังบล็อกการทำให้ฟังก์ชัน "จำลอง" นี้รับพารามิเตอร์ ดังนั้นเมื่อถูกเรียกก็ควรเปิดชีตตามดัชนี

function onOpen() {
  var monthPlanShortcuts = SpreadsheetApp.getUi().createMenu("Month Plan Shortcuts");
  var gotoSheet = SpreadsheetApp.getUi().createMenu("Go to sheet");
  // get properties to know who is the editor
  var userProperties = PropertiesService.getUserProperties();
  var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();
  if (sheets.length > 1) {
    for (var index = 0; index< sheets.length;index++)
    {
      var currentIndex = userProperties.setProperty("index",index);
      gotoSheet.addItem(sheets[index].getName(),"dummy");
    }
  }
  monthPlanShortcuts
    .addItem('View Current Week Plan', 'gotoCurrentWeek')
    .addItem('Go to Specific Week', 'gotoSpecificWeek')
  .addSeparator()
  .addSubMenu(gotoSheet)
  .addToUi();
}

ข้อเสนอแนะใด ๆ ??


person Mo SAEED    schedule 07.02.2017    source แหล่งที่มา
comment
ขออภัย คุณไม่สามารถส่งค่าพารามิเตอร์จากฟังก์ชันใน .addItem('Title of Menu Item', 'function name') ไปยังฟังก์ชันที่กำลังเรียกใช้ได้ ดังนั้นจึงไม่มีทางทำสิ่งที่คุณต้องการได้ในขั้นตอนเดียวจากเมนู คุณจะต้องเปิดกล่องโต้ตอบหรือแถบด้านข้างจากเมนู หรือเปิดแถบด้านข้างโดยอัตโนมัติเมื่อสเปรดชีตเปิดขึ้น และด้วย HTML และ JavaScript คุณสามารถสร้างสิ่งที่จะเชื่อมโยงชื่อชีตกับโค้ดใดก็ได้ที่คุณต้องการเรียกใช้   -  person Alan Wells    schedule 07.02.2017
comment
@SandyGood ขอบคุณ แต่ไม่มีวิธีแก้ปัญหาเช่น 1- สร้างฟังก์ชันด้วยชื่อเฉพาะและทำเครื่องหมายฟังก์ชันการทำงานเพื่อใช้งานชีตหรือ 2- รับดัชนีของรายการซึ่งดัชนีจะอ้างอิงถึงดัชนีชีตเช่นกัน หรือ 3- ฟังก์ชันเฉพาะที่ใช้ชื่อฟังก์ชันและถ่ายโอนไปยังฟังก์ชันพร้อมพารามิเตอร์   -  person Mo SAEED    schedule 08.02.2017
comment
ฉันไม่รู้ว่ามีงานอะไรอยู่บ้าง   -  person Alan Wells    schedule 09.02.2017


คำตอบ (1)


มีวิธีแก้ไขแฮ็ก:

สร้างฟังก์ชันระดับบนสุดแบบไดนามิก จากนั้นอ้างอิงถึงฟังก์ชันเหล่านั้นเมื่อเพิ่มรายการเมนู

ตัวอย่าง:

/**
 * @OnlyCurrentDoc
 */
function onOpen() {
  let menu = SpreadsheetApp.getUi().createMenu("Dynamic entries");
  let ss = SpreadsheetApp.getActiveSpreadsheet();
  for (var sheet of ss.getSheets()) {
    let id = sheet.getSheetId();
    let funName = "dynamicFun" + id;
    menu.addItem(sheet.getName() + "(" + id + ")", funName)
  }
  menu.addToUi();
}

for (var sheet of SpreadsheetApp.getActiveSpreadsheet().getSheets()) {
  let id = sheet.getSheetId();
  let funName = "dynamicFun" + id;
  this[funName] = function() { myRealFun(id); };
}

function myRealFun(id) {
  SpreadsheetApp.getUi().alert("" + id + " was pressed");
}
person Florian Loitsch    schedule 31.12.2020