@kura-ken

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

GASの関数をトリガーの時間主導型で実行した場合のみエラーが発生する

解決したいこと

GoogleAppsScriptで請求書PDFを請求リスト順に作成する関数を作成しました。
作成したのは「請求書一括作成.gs」と「請求書一括作成2列目.gs」の二つです。
GASの実行時間に制限があるので関数を分けて作成しています。
二つの関数はスクリプトの画面から直接実行すると正常に動作している状況です。
「請求書一括作成.gs」はトリガーの時間主導型で実行しても問題なく動作します。
ですが、「請求書一括作成2列目.gs」はトリガーの時間主導型で実行する場合のみエラーが出てしまいます。
何が原因なのかわからなくて困っています。なにかわかることあれば教えていただきたいです。

※関数を分けているので変数に全て2がついています。

発生している問題・エラー

Exception: Request failed for https://docs.google.com returned code 400. 
Truncated server response: <!DOCTYPE html><html lang="ja"><head><meta name="description" 
content="ウェブ ワープロ、プレゼンテーション、スプレッドシート"><meta name="viewport" 
content="width=device-wid... (use muteHttpExceptions option to examine full response)
    at processAutoPdf2(請求書一括作成2列目:68:31)
    at AutoPdf2(請求書一括作成2列目:24:5)

該当するソースコード

const ss2 = SpreadsheetApp.openById("XXXXXXXXXXXXXXXXXX");//ssのID
//請求書作成するシートを取得
const sheet2 = ss2.getSheetByName('請求書作成');
//請求先の名前を参照するシートを取得
const nameList2 = ss2.getSheetByName('請求リスト');
//請求リストの行数
const listRows2 = nameList2.getLastRow();
//請求リストの範囲を取得
const listRange2 = nameList2.getRange(1, 2, listRows2, 1);
//リストを取得
const names2 = listRange2.getValues();
//PDF保存フォルダ
const rangefolder2 = nameList2.getRange("I19").getValue();
const folder2 = DriveApp.getFolderById(rangefolder2);
//請求書の日付(yyyymmdd)を取得
const datesell2 = sheet2.getRange('H3').getValue();



function AutoPdf2() {
  // 請求先リストから1件づつPDFを作成
  for (let i = 0; i < names2.length; ++i) {
    processAutoPdf2(i);
  }
}

//ループ処理
function processAutoPdf2(i) {
  let name2 = names2[i][0];
  sheet2.getRange('C3').setValue(name2);//リストの値を順に入力
  SpreadsheetApp.flush();//スプレッドシートに値の変更を反映させる

  let key2 = ss2.getId();
  let gid2 = sheet2.getSheetId();
  let token2 = ScriptApp.getOAuthToken();
  //スプレッドシートのPDFURL
  let baseurl2 = "https://docs.google.com/spreadsheets/d/"
    + key2
    + "/export?gid="
    + gid2;

  //PDFのオプションを指定
  let pdfOptions2 = "&exportFormat=pdf&format=pdf"
  + "&size=A4" //用紙サイズ (A4)
  + "&portrait=true"  //用紙の向き true: 縦向き / false: 横向き
  + "&fitw=true"  //ページ幅を用紙にフィットさせるか true: フィットさせる / false: 原寸大
  + "&top_margin=0.50" //上の余白
  + "&right_margin=0.50" //右の余白
  + "&bottom_margin=0.50" //下の余白
  + "&left_margin=0.50" //左の余白
  + "&horizontal_alignment=CENTER" //水平方向の位置
  + "&vertical_alignment=TOP" //垂直方向の位置
  + "&printtitle=false" //スプレッドシート名の表示有無
  + "&sheetnames=false" //シート名の表示有無
  + "&gridlines=false" //グリッドラインの表示有無
  + "&fzr=false" //固定行の表示有無
  + "&fzc=false" //固定列の表示有無;
    
  let url2 = baseurl2 + pdfOptions2;
  
  let options2 = {
    headers: {
      "Authorization": "Bearer " + token2
    }
  }
  let response2 = UrlFetchApp.fetch(url2, options2);
  let file2 = response2.getBlob();
  let price2 = sheet2.getRange('C17').getValue();//請求金額を取得
  if (price2 == 0) {
    //請求金額0円の場合は作成しない
    console.log(`${names2[i]}様は0円なので請求書なし`);
    Utilities.sleep(10000);//10秒待機
  } else {
    //請求書保存先フォルダ
    file2.setName("(" + names2[i] + "様)請求書_" + datesell2 + ".pdf"); //ファイル名
    folder2.createFile(file2);//PDFファイルを作成しフォルダに保存
    console.log(`「${datesell2}請求書_${names2[i]}様.pdf」を生成しました。`);
    Utilities.sleep(10000);//10秒待機
  }
}
0 likes

No Answers yet.

Your answer might help someone💌