ONLYOFFICEマクロを使用してPDFフォーム文書を分析する方法

2025年04月30日著者:Denis

今日の急速に変化するデジタル環境では、ライター、編集者、コンテンツ制作者はしばしばドキュメントに関する有益なインサイトを得るのに苦労している人が多いです。可読性、単語頻度、構造バランスなどの指標を理解することでドキュメントの品質を大幅に向上させることができますが、手動での分析は時間がかかり、結果が一貫しません。本ブログ記事では、ドキュメントを自動的に解析し、包括的なレポートを生成する強力なONLYOFFICEマクロの作成方法をご紹介します。

ONLYOFFICE マクロによる PDF フォームドキュメントの解析方法

ドキュメント解析マクロの構築

マクロを機能別のコンポーネントに分解し、それぞれのパートがどのように動作するかを説明します。

メイン関数の設定

マクロの中核となる analyzeDocument() 関数で、この関数が解析プロセス全体を統括します:

function analyzeDocument() {
    try {
        // Get document and all text
        var oDocument = Api.GetDocument();
        var allText = "";
        var paragraphs = oDocument.GetAllParagraphs();
        
        // Check if document is empty
        if (paragraphs.length === 0) {
            console.log("Warning: Document is empty or no paragraphs found for analysis.");
            return;
        }
        
        // Collect all text
        paragraphs.forEach(function(paragraph) {
            allText += paragraph.GetText() + " ";
        });
        
        // Perform analyses
        var stats = calculateBasicStats(allText, paragraphs);
        var advancedStats = calculateAdvancedStats(allText, stats);
        var commonWords = findCommonWords(allText, 10);
        
        // Create report
        createAndAddReport(oDocument, stats, advancedStats, commonWords);
        
        // Log success
        console.log("Success: Document analysis completed. Report added to the end of the document.");
    } catch (error) {
        console.log("Error: " + error.message);
    }
}

この関数はまずドキュメントからすべてのテキストを収集し、それを専門の解析関数に渡し、最後にレポートを作成します。try-catch ブロックにより、エラー発生時にもマクロが適切に処理を継続できるようになります。

基本統計の計算

calculateBasicStats() 関数はテキストを処理し、基本的な指標を抽出します:

function calculateBasicStats(text, paragraphs) {
    // Word count
    var words = text.split(/\s+/).filter(function(word) { 
        return word.length > 0; 
    });
    var wordCount = words.length;
    
    // Sentence count
    var sentences = text.split(/[.!?]+/).filter(function(sentence) { 
        return sentence.trim().length > 0; 
    });
    var sentenceCount = sentences.length;
    
    // Paragraph count
    var paragraphCount = paragraphs.length;
    
    // Character count
    var charCountWithSpaces = text.length;
    var charCountWithoutSpaces = text.replace(/\s+/g, "").length;
    
    // Line count (approximate)
    var lineCount = Math.ceil(charCountWithSpaces / 70);
    
    return {
        wordCount: wordCount,
        sentenceCount: sentenceCount,
        paragraphCount: paragraphCount,
        charCountWithSpaces: charCountWithSpaces,
        charCountWithoutSpaces: charCountWithoutSpaces,
        lineCount: lineCount,
        words: words,
        sentences: sentences
    };
}

この関数はテキストを単語と文に分割し、段落数をカウントし、文字数および行数を計算します。

高度な解析の実行

より詳細なインサイトを得るために、calculateAdvancedStats() 関数はさらに高度な指標を計算します:

function calculateAdvancedStats(text, basicStats) {
    // Average sentence length
    var avgWordsPerSentence = basicStats.wordCount / Math.max(1, basicStats.sentenceCount);
    
    // Average paragraph length
    var avgWordsPerParagraph = basicStats.wordCount / Math.max(1, basicStats.paragraphCount);
    
    // Average word length
    var totalWordLength = basicStats.words.reduce(function(sum, word) {
        return sum + word.length;
    }, 0);
    var avgWordLength = totalWordLength / Math.max(1, basicStats.wordCount);
    
    // Readability score (simplified Flesch-Kincaid)
    var readabilityScore = 206.835 - 1.015 * avgWordsPerSentence - 84.6 * (totalWordLength / basicStats.wordCount);
    
    // Estimated reading time
    var readingTimeMinutes = Math.ceil(basicStats.wordCount / 200);
    
    return {
        avgWordsPerSentence: avgWordsPerSentence,
        avgWordsPerParagraph: avgWordsPerParagraph,
        avgWordLength: avgWordLength,
        readabilityScore: readabilityScore,
        readingTimeMinutes: readingTimeMinutes
    };
}

これにより、平均文長、平均段落長、可読性スコア、および推定読書時間が計算されます。

単語頻度の分析

findCommonWords() 関数は最も頻出する単語を特定します:

function findCommonWords(text, limit) {
    // Clean text and convert to lowercase
    var cleanText = text.toLowerCase().replace(/[.,\/#!$%\^&*;:{}=\-_`~()]/g, "");
    
    // Split into words
    var words = cleanText.split(/\s+/).filter(function(word) { 
        return word.length > 3; 
    });
    
    // Calculate word frequencies
    var wordFrequency = {};
    words.forEach(function(word) {
        wordFrequency[word] = (wordFrequency[word] || 0) + 1;
    });
    
    // Filter stop words
    var stopWords = ["this", "that", "with", "from", "have", "been"];
    stopWords.forEach(function(stopWord) {
        delete wordFrequency[stopWord];
    });
    
    // Sort by frequency
    var sortedWords = Object.keys(wordFrequency).sort(function(a, b) {
        return wordFrequency[b] - wordFrequency[a];
    });
    
    // Return top N words
    return sortedWords.slice(0, limit).map(function(word) {
        return { word: word, frequency: wordFrequency[word] };
    });
}

この関数は句読点を削除し、一般的なフィラーワードを除外し、ドキュメント内で最も頻出する単語を返します。

レポートの生成

最後に、createAndAddReport() 関数がすべての解析結果をまとめてフォーマットします:

function createAndAddReport(oDocument, basicStats, advancedStats, commonWords) {
    // Add new page
    var oParagraph = Api.CreateParagraph();
    oParagraph.AddPageBreak();
    oDocument.AddElement(oDocument.GetElementsCount(), oParagraph);
    
    // Add title
    var oHeading = Api.CreateParagraph();
    oHeading.AddText("DOCUMENT ANALYSIS REPORT");
    oDocument.AddElement(oDocument.GetElementsCount(), oHeading);
    
    // Add basic statistics section
    var oSubHeading = Api.CreateParagraph();
    oSubHeading.AddText("BASIC STATISTICS");
    oDocument.AddElement(oDocument.GetElementsCount(), oSubHeading);
    
    // Add statistics content
    // ... (code that adds individual statistics)
    
    // Add advanced analysis section
    // ... (code that adds advanced metrics)
    
    // Add word frequency section
    // ... (code that adds word frequency list)
    
    // Add footer
    var oFootnotePara = Api.CreateParagraph();
    oFootnotePara.AddText("This report was generated by OnlyOffice Document Statistics and Analysis Tool on " + 
                        new Date().toLocaleString() + ".");
    oDocument.AddElement(oDocument.GetElementsCount(), oFootnotePara);
}

この関数はドキュメントの末尾に、すべての解析結果を含む構造化されたレポートを作成します。

ONLYOFFICE マクロによる PDF フォームドキュメントの解析結果レポート

マクロの全コード

以下にコピーして使用できるマクロの全コードを示します:

(function() {
    // Main function - starts all operations
    function analyzeDocument() {
        try {
            // Get document and all text
            var oDocument = Api.GetDocument();
            var allText = "";
            var paragraphs = oDocument.GetAllParagraphs();
            
            // Check if document is empty
            if (paragraphs.length === 0) {
                console.log("Warning: Document is empty or no paragraphs found for analysis.");
                return;
            }
            
            // Collect all text
            paragraphs.forEach(function(paragraph) {
                allText += paragraph.GetText() + " ";
            });
            
            // Calculate basic statistics
            var stats = calculateBasicStats(allText, paragraphs);
            
            // Perform advanced analysis
            var advancedStats = calculateAdvancedStats(allText, stats);
            
            // Find most common words
            var commonWords = findCommonWords(allText, 10);
            
            // Create and add report to the document
            createAndAddReport(oDocument, stats, advancedStats, commonWords);
            
            // Inform user
            console.log("Success: Document analysis completed. Report added to the end of the document.");
        } catch (error) {
           console.log("Error: An error occurred during processing: " +         error.message);
        }
    }
    
    // Calculate basic statistics
    function calculateBasicStats(text, paragraphs) {
        // Word count
        var words = text.split(/\s+/).filter(function(word) { 
            return word.length > 0; 
        });
        var wordCount = words.length;
        
        // Sentence count
        var sentences = text.split(/[.!?]+/).filter(function(sentence) { 
            return sentence.trim().length > 0; 
        });
 var sentenceCount = sentences.length;
        
        // Paragraph count
        var paragraphCount = paragraphs.length;
        
        // Character count (with and without spaces)
        var charCountWithSpaces = text.length;
        var charCountWithoutSpaces = text.replace(/\s+/g, "").length;
        
        // Line count (approximate)
        var lineCount = Math.ceil(charCountWithSpaces / 70); // Approximately 70 characters/line
   return {
            wordCount: wordCount,
            sentenceCount: sentenceCount,
            paragraphCount: paragraphCount,
            charCountWithSpaces: charCountWithSpaces,
            charCountWithoutSpaces: charCountWithoutSpaces,
            lineCount: lineCount,
            words: words,
            sentences: sentences
        };
    }
    
    // Calculate advanced statistics
    function calculateAdvancedStats(text, basicStats) {
        // Average sentence length (in words)
        var avgWordsPerSentence = basicStats.wordCount / Math.max(1, basicStats.sentenceCount);
        
        // Average paragraph length (in words)
        var avgWordsPerParagraph = basicStats.wordCount / Math.max(1, basicStats.paragraphCount);
        
        // Average word length (in characters)
        var totalWordLength = basicStats.words.reduce(function(sum, word) {
            return sum + word.length;
        }, 0);
        var avgWordLength = totalWordLength / Math.max(1, basicStats.wordCount);
        
        // Readability score (simplified Flesch-Kincaid)
        var readabilityScore = 206.835 - 1.015 * (basicStats.wordCount / Math.max(1, basicStats.sentenceCount)) - 84.6 * (totalWordLength / Math.max(1, basicStats.wordCount));
        
        // Estimated reading time (minutes)
        var readingTimeMinutes = Math.ceil(basicStats.wordCount / 200); // Average reading speed 200 words/minute
        
        return {
            avgWordsPerSentence: avgWordsPerSentence,
            avgWordsPerParagraph: avgWordsPerParagraph,
            avgWordLength: avgWordLength,
            readabilityScore: readabilityScore,
            readingTimeMinutes: readingTimeMinutes
        };
    }
    
    // Find most common words
    function findCommonWords(text, limit) {
        // Clean text and convert to lowercase
        var cleanText = text.toLowerCase().replace(/[.,\/#!$%\^&*;:{}=\-_`~()]/g, "");
        
     // Split into words
        var words = cleanText.split(/\s+/).filter(function(word) { 
            return word.length > 3; // Filter out very short words
        });
   // Calculate word frequencies
        var wordFrequency = {};
        words.forEach(function(word) {
            if (wordFrequency[word]) {
                wordFrequency[word]++;
            } else {
                wordFrequency[word] = 1;
            }
        });

   // Filter stop words (common English words)
        var stopWords = ["this", "that", "these", "those", "with", "from", "have", "been", "were", "they", "their", "what", "when", "where", "which", "there", "will", "would", "could", "should", "about", "also"];
        stopWords.forEach(function(stopWord) {
            if (wordFrequency[stopWord]) {
                delete wordFrequency[stopWord];
            }
        });
        
        // Sort by frequency
        var sortedWords = Object.keys(wordFrequency).sort(function(a, b) {
            return wordFrequency[b] - wordFrequency[a];
        });
        
        // Take top N words
        var topWords = sortedWords.slice(0, limit);
        
        // Return results as word-frequency pairs
        return topWords.map(function(word) {
            return {
                word: word,
                frequency: wordFrequency[word]
            };
        });
    }
   
    // Create and add report to document
    function createAndAddReport(oDocument, basicStats, advancedStats, commonWords) {
        // Add new page
        var oParagraph = Api.CreateParagraph();
        oParagraph.AddPageBreak();
        oDocument.AddElement(oDocument.GetElementsCount(), oParagraph);
        
        // Main title - highlighting in capital letters
        var oHeading = Api.CreateParagraph();
        oHeading.AddText("DOCUMENT ANALYSIS REPORT");
        oDocument.AddElement(oDocument.GetElementsCount(), oHeading);
        
        // Subheading - in capital letters
        var oSubHeading = Api.CreateParagraph();
        oSubHeading.AddText("BASIC STATISTICS");
        oDocument.AddElement(oDocument.GetElementsCount(), oSubHeading);

        // Add basic statistics
        var oStatsPara = Api.CreateParagraph();
        oStatsPara.AddText("• Word Count: " + basicStats.wordCount);
        oDocument.AddElement(oDocument.GetElementsCount(), oStatsPara);
        
        oStatsPara = Api.CreateParagraph();
        oStatsPara.AddText("• Sentence Count: " + basicStats.sentenceCount);
        oDocument.AddElement(oDocument.GetElementsCount(), oStatsPara);
        
        oStatsPara = Api.CreateParagraph();
        oStatsPara.AddText("• Paragraph Count: " +      basicStats.paragraphCount);
        oDocument.AddElement(oDocument.GetElementsCount(), oStatsPara);
        
        oStatsPara = Api.CreateParagraph();
        oStatsPara.AddText("• Character Count (with spaces): " +  basicStats.charCountWithSpaces);
        oDocument.AddElement(oDocument.GetElementsCount(), oStatsPara);
        
        oStatsPara = Api.CreateParagraph();
        oStatsPara.AddText("• Character Count (without spaces): " +  basicStats.charCountWithoutSpaces);
        oDocument.AddElement(oDocument.GetElementsCount(), oStatsPara);
        

        oStatsPara = Api.CreateParagraph();
        oStatsPara.AddText("• Estimated Line Count: " + basicStats.lineCount);
        oDocument.AddElement(oDocument.GetElementsCount(), oStatsPara);
        
        // Advanced analysis title
        oSubHeading = Api.CreateParagraph();
        oSubHeading.AddText("ADVANCED ANALYSIS");
        oDocument.AddElement(oDocument.GetElementsCount(), oSubHeading);
        
        // Add advanced analysis results
        oStatsPara = Api.CreateParagraph();
        oStatsPara.AddText("• Average Sentence Length: " + advancedStats.avgWordsPerSentence.toFixed(2) + " words");
        oDocument.AddElement(oDocument.GetElementsCount(), oStatsPara);
        
        oStatsPara = Api.CreateParagraph();
        oStatsPara.AddText("• Average Paragraph Length: " + advancedStats.avgWordsPerParagraph.toFixed(2) + " words");
        oDocument.AddElement(oDocument.GetElementsCount(), oStatsPara);
        
        oStatsPara = Api.CreateParagraph();
        oStatsPara.AddText("• Average Word Length: " + advancedStats.avgWordLength.toFixed(2) + " characters");
        oDocument.AddElement(oDocument.GetElementsCount(), oStatsPara);
        
        oStatsPara = Api.CreateParagraph();
        oStatsPara.AddText("• Readability Score: " + advancedStats.readabilityScore.toFixed(2));
        oDocument.AddElement(oDocument.GetElementsCount(), oStatsPara);
        
        oStatsPara = Api.CreateParagraph();
        oStatsPara.AddText("• Estimated Reading Time: " + advancedStats.readingTimeMinutes + " minutes");
        oDocument.AddElement(oDocument.GetElementsCount(), oStatsPara);
        
        // Common words title
        oSubHeading = Api.CreateParagraph();
        oSubHeading.AddText("MOST FREQUENTLY USED WORDS");
        oDocument.AddElement(oDocument.GetElementsCount(), oSubHeading);
        
        // We'll create a simple list instead of a table
        if (commonWords.length > 0) {
            for (var i = 0; i < commonWords.length; i++) {
                var oWordPara = Api.CreateParagraph();
                oWordPara.AddText((i + 1) + ". " + commonWords[i].word + " (" + commonWords[i].frequency + " times)");
                oDocument.AddElement(oDocument.GetElementsCount(), oWordPara);
            }
        } else {
            var oNoneFoundPara = Api.CreateParagraph();
            oNoneFoundPara.AddText("No frequently used words found.");
            oDocument.AddElement(oDocument.GetElementsCount(), oNoneFoundPara);
        }
        
        // Footer note
        var oFootnotePara = Api.CreateParagraph();
        oFootnotePara.AddText("This report was generated by OnlyOffice Document Statistics and Analysis Tool on " + 
                            new Date().toLocaleString() + ".");
        oDocument.AddElement(oDocument.GetElementsCount(), oFootnotePara);
    }
    
    // Run the macro
    analyzeDocument();
})();

ONLYOFFICE でこのマクロを使用する方法

  1. ONLYOFFICE でドキュメントを開きます
  2. 「表示」タブに移動し、「マクロ」を選択します
  3. 新しいマクロを作成し、コードを貼り付けます
  4. マクロを実行します
  5. 詳細な解析レポートがドキュメントの末尾に追加されます

では、マクロを実行して動作を確認してみましょう!

このマクロは、モダンなオフィス環境でテキスト解析やドキュメント処理を自動化したいプロフェッショナルにとって貴重なツールです。皆様の作業ツールキットにお役立ていただければ幸いです。

独自のカスタムマクロを作成したり、本マクロを拡張したりするために、ONLYOFFICE API ドキュメントをぜひご覧ください。改善アイデアや新しいマクロのご提案がありましたら、ぜひ お問い合わせ ください。皆様のフィードバックは、ドキュメント作成と編集をより効率的にするツール開発を継続する上で大変貴重です。

著者について

著者 Firat Demir

ONLYOFFICEの無料アカウントを登録する

オンラインでドキュメント、スプレッドシート、スライド、フォーム、PDFファイルの閲覧、編集、共同作業